driver基础
驱动测试时,linux驱动常以模块方式插入内核。
应包含头文件:linux/kernel.h,linux/module.h
设备驱动的一般结构:
Soc(主芯片->设备控制器->外设引脚)
--------------------------------
设备相关芯片(DM9000/MM8960/MAX3232)
--------------------------------
设备插接件(RJ45/Speaker/DB9)
系统中的每个设备由“设备特殊文件”来代表,通过/dev访问驱动程序,/dev目录下的文件可用来访问驱动程序。
/dev/ttySAC0 板上串口设备
/dev/tty0-6 虚拟控制台
/dev/zero 软件设备
/dev/null 空设备
/dev/urandom 随机数字
/dev/dsp 音频声卡
常用设备文件操作方法:
1)重定向符 > 写设备
echo data > /dev/ttyS0
cat sunflower.bmp > /dev/fb0
cat ringing.wav > /dev/dsp
2)cat 读设备
cat /dev/ttyS0 (pc linux)
cat /dev/ttySAC0 (板子 linux)
3)dd 读写设备
将文件写入串口中
dd if=1.txt of=/dev/ttySAC0
写入0x00到2.txt中,每次读写的数据量是512个字节,写入2次
dd if=/dev/zero of=2.txt count=2 bs=512
随即显示
dd if=/dev/urandom of=/dev/fb0
播放1.wav文件
dd if=1.wav of=/dev/dsp
MMU/CORE/SOC/SDRAM之间的关系
ProcessCore = ALU + Register(PC, R0-R15, CPSR)
CORE = ProcessCore + MMU + CP15 + cache
SOC = CORE + SFR + iROM + iRAM
SOC <=bus=> SDRAM
CP15为协处理器,管理MMU
无论在用户应用程序,还是内核模块中,打印出的变量(全局和局部)、函数名都是虚拟地址。
裸板编程中用到的地址,从数据手册中得到的地址,都是没有启用mmu的,代表的都是物理地址。
LDR/STR命令中,涉及到的内存地址,从本质上说,都是虚拟地址。
当MMU没有启用时,上面的虚拟地址等于物理地址;如果启用MMU,这些虚拟地址就会映射为不同的物理地址。
内核空间和用户空间:
1.x86 linux内存设计
0-3G用户空间(0x0-0xC0000000)
3G-4G系统空间(0xC0000000-0xFFFFFFFF)
2.ARM linux内存设计
0-(3G-16M) 用户空间(0x0-0xBF000000)
(3G-16M)-3G 内核模块(0xBF000000-0xC0000000)
3G-4G 系统空间
linux驱动用虚拟地址,而不是物理地址,其运行于内核态(3G-4G)。
物理地址映射为虚拟地址,采用mmap()或ioremap()函数。
#include <asm/io.h>
volatile unsigned int *V_ULCON0;
volatile unsigned int *V_UCON0;
V_ULCON0 = ioremap(0xE2900000, 4);
V_UCON0 = ioremap(0xE2900004, 4);
//****紧挨着的物理地址可同时映射
volatile unsigned int *V_ULCON0;
volatile unsigned int *V_UCON0;
volatile unsigned char *v_base;
v_base = ioremap(0xE2900000, 8);
V_ULCON0 = v_base;
V_UCON0 = v_base + 4;
V_ULCON0 = 0x3;
V_UCON0 = 0x5;
驱动卸载时要解除映射。
iounmap(v_base);
常用网站:
http://lxr.free-electrons.com/在线阅读linux内核源码,查找内核符号的定义和引用。
http://kernelbook.sourceforge.net/kernel-api.html/查找哪些函数可以在模块中使用。
交互式传输文件方法:
1.串口(通过xmodem协议)
开发板上输入rx hello
pc机:ctrl+a z =>s发送文件(minicom)
minicom的设置采用命令:sudo minicom -s
2.nfs开发板上挂在共享文件
mount -t nfs -o tcp,nolock 192.168.103.200:/home/akaedu/rootfs /mnt
注:192.168.103.200为PC ip地址。
3.ftp下载
ftp登录后put上传。
ftp登录后PC机上目录切换采用命令lcd。
ftp脚本:
ftp.sh
#! /bin/sh
DIR=$1
FILE=$2
ftp -i -in <<!
open 192.168.0.200 21
user username password
cd /home
lcd $DIR
binary
put $FILE
bye
!
应用:
./ftp.sh para1 para2
参数para1为文件所在目录
参数para2为文件名
./ftp.sh ./ hello
可将ftp.sh移动至/bin目录下,方便操作。
driver基础的更多相关文章
- 使用DataFlow表达ControlFlow的一些思考
一.控制流 从接触面向过程语言开始,使用控制流编程的概念已是司空见惯. if (condition) { // do something } else { // do something else } ...
- 深入linux kernel内核配置选项
============================================================================== 深入linux kernel内核配置选项 ...
- 将Cesium ion上的3D Tiles和Bing imagery应用到osgEarth
Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ Pelican Mapping 激动的宣布支持加载Cesium ...
- [源码解析] 深度学习分布式训练框架 horovod (4) --- 网络基础 & Driver
[源码解析] 深度学习分布式训练框架 horovod (4) --- 网络基础 & Driver 目录 [源码解析] 深度学习分布式训练框架 horovod (4) --- 网络基础 & ...
- mongodb shell和Node.js driver使用基础
开始: Mongo Shell 安装后,输入mongo进入控制台: //所有帮助 > help //数据库的方法 > db.help() > db.stats() //当前数据库的状 ...
- JSP | 基础 | 加载类失败:com.mysql.jdbc.Driver
两个原因: 1. 连接数据库需要的jar包没有导入Tomcat的lib库中 解决方案: 打开Tomcat的安装目录下的lib文件夹,把jar包拖进lib库后,重启tomcat服务器 2. mysql ...
- 【linux基础err】NVIDIA-SMI has failed because it could't communicate with the NVIDIA driver.
问题 安装nvidia driver和cuda关机重启之后出现不能进入系统的问题,进入命令行模式使用nvidia-smi检查驱动的问题. nvidia-smi NVIDIA-SMI has faile ...
- 设备驱动基础学习--platform driver简单实现
platform是一条虚拟的总线.设备用platform_device表示,驱动用platform_driver进行注册,Linux platform driver机制和传统的device drive ...
- Maven多模块,Dubbo分布式服务框架,SpringMVC,前后端分离项目,基础搭建,搭建过程出现的问题
现互联网公司后端架构常用到Spring+SpringMVC+MyBatis,通过Maven来构建.通过学习,我已经掌握了基本的搭建过程,写下基础文章为而后的深入学习奠定基础. 首先说一下这篇文章的主要 ...
随机推荐
- 【spring data jpa】spring data jpa 中的update 更新字段,如果原字段值为null不处理,不为null则在原来的值上加一段字符串
示例代码: /** * 如果barCode字段值为null则不处理 * 如果barCode字段值不为null则在原本值的前面拼接 del: * @param dealer * @return */ @ ...
- html里嵌入CSS的三种方式
在HTML中定义CSS的方式有:Embedding(嵌入式).Linking(引用式).Inline(内联式),下面通过实例为大家详细介绍下它们的特点 在HTML中常用以下3种方式定义CSS:Em ...
- IE11快捷键 双击没反应的解决办法
WIN + R,regedit,找到 HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main 对左侧树Main节点右键——权限. 正常情 ...
- kernel简介
内存管理 一般来看有三种类型的地址:物理地址.线性地址和逻辑地址,逻辑地址的精髓在于将地址分成两部分:段基地址+偏移,翻译的过程如下: 线性地址的精髓在于将所有的内存按照一定的大小分成了一页一页,对多 ...
- linux基础-第二十单元_计划任务crond服务
第二十单元 计划任务crond服务 什么是计划任务:后台运行,到了预定的时间就会自动执行的任务,前提是:事先手动将计划任务设定好.这就用到了crond服务 crond服务相关的软件包[root@MiW ...
- Android画图系列(二)——自己定义View绘制基本图形
这个系列主要是介绍下Android自己定义View和Android画图机制.自己能力有限.假设在介绍过程中有什么错误.欢迎指正 前言 在上一篇Android画图系列(一)--自己定义View基础中我们 ...
- extjs4权限管理,actioncolumn列显示隐藏或禁用
//隐藏getClass: function(v, meta, rec) { if ( someCondition ) { return 'x-hidden' } }//加入其他样式getClass: ...
- 字符串去重(hashSet)
public static String deleteRepeat(String strn){ String s=strn; String[] array = s.sp ...
- 集成方法:渐进梯度回归树GBRT(迭代决策树)
http://blog.csdn.net/pipisorry/article/details/60776803 单决策树C4.5由于功能太简单.而且非常easy出现过拟合的现象.于是引申出了很多变种决 ...
- Rails时间扩展方法
1.时间扩展方法: beginning_of_day,end_of_day等等 Time.now.end_of_day 2.ruby类型判断 is_a?(类型) 如:b.is_a?(Array)