最近下定决心要重新深入的研究armlinux驱动开发,将学习笔记记录留给网友,欢迎共同讨论学习。
有些可能认知错误,希望高手给予纠正。
第一篇Linux驱动基础--------2楼
第一篇Linux驱动基础
写linux驱动是一种辛苦和复杂的工作,驱动作为硬件和应用程序的连接,在嵌入式的操作系统开发中起到重要的作用,首先从构架和分类来看下驱动的构架。
字符设备特点
以字节为单位进行读写,也就是一次传送一个字节。
至少需要open 、close、read和write进行系统的调用。
只能顺序访问数据通道,但是framebuffer类的设备中,应用程序可以通过位置重定义进行特定位置数据的读取。
应用程序通过/dev下的文件系统结点来访问字符设备,比如访问串口0对应的驱动设备 /dev/ttySAC0,访问自己写的驱动程序/dev/xxx。
块设备特点
数据已块的形式进行存放,大小确定,如16k 32k等。
应用程序也是通过open 、close、read和write进行系统调用。
块设备和字符设备的区别:内核管理数据的方式不同。
块设备驱动程序必须向内核文件系统提供专用的接口,这样接口可以使在块设备中存放的文件系统,挂载块设备。比如armlinux系统访问一U盘、TF卡等,都需要一个mount操作。
网络设备
传送的数据是有结构的, 成块的,但是块大小不固定,有结构定义。
任何一个网络通讯都需要一个网络接口进行数据传输。
一个网络接口负责数据的发送和接收。
内核通过调用一套和数据包传送相关函数进行数据传送。
在前期开发中,驱动以模块的形式进行存储,后期稳定之后将驱动打包到内核。
驱动加载的方法通常有insmod/modprobe例如 insmod ./xxx.o
而卸载则用rmmod进行。
__init 生命之后的函数只用于加载和卸载的时候,其他的时候不进行操作。初始化加载完之后,可将该函数占用的内存释放。
__exit
insmod ./xxx.o rmmod xxx 2.6.29之后
lsmod|grep xxx
在驱动中,常用static对函数进行修饰,static int xxx:为了说明xxx函数只在当前函数中使用
驱动不是进程,也不是线程,是内核函数的一部分,是线程的一部分。
对于嵌入式的驱动,一般是用来驱动硬件来完成某种功能。
关于如何在ubuntu12.04的32位系统中进行linxu驱动的开发,请看该帖子
http://www.eepw.com.cn/article/264572.htm
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |