《原子Linux驱动开发》基础阅读1:了解字符设备驱动开发
[复制链接]
字符设备驱动开发是linux驱动开发中最基础的部分,重点学习字符设备驱动开发框架。
字符设备驱动是linux驱动中最基础的一类设备,驱动字符设备就是一个一个字节,按照字节流进行读写操作的设备,比如常见的IO操作,按键,SPI等,都是字符设备。这些设备的驱动就叫做字符设备驱动。
那么,在应用程序中是如何调用驱动程序的呢?应用程序通过API函数调用相应的库,然后进入内核,在驱动程序中的相应的函数再进行具体的硬件设备动作:
应用程序运行在用户空间,而驱动属于内核的一部分,因此驱动的运行内存实际上是应用对内核的操作,但是用户空间是不能直接对内核进行操作的,这个时候就通过系统调用的方法实现用户对内核空间的操作,应用程序通过c库中的具体函数,再通过系统调用对内核进行操作,实现具体的驱动的操作,所以说驱动的开发实际上是一个底层的开发。
Linux内核驱动开发,具体的就是实现驱动中最常见的read,write,open,close等等函数的实现,这些函数在Linux中有具体的函数结构体,要符合具体架构。
那么,字符设备驱动开发要遵循怎么样的一个步骤呢?我们在进行裸机开发的时候都要进行外设的初始化,linux驱动开发也不例外,而且需要按照其规定的框架进行编写。在linux驱动开发中,重点就是对其驱动框架的学习。
Linux驱动有两种运行模式,一种是将驱动编译进Linux内核,一种是将驱动编译成模块,通过使用命令加载驱动模块。相对来说,使用编译成模块的方式有诸多优点,例如我们在调试的时候,只需要编译驱动代码即可,不用全部编译,整体的全部编译还是很费时间的,并且下载也很慢。调试阶段,建议将其编译成模块进行调试,在进行测试无误后可以写入到内核中。模块的操作就有加载和卸载两种操作方式,对于字符设备驱动而言,加载成功后需要注册字符设备,同时卸载成功后也要注销相应的字符设备。
这个时候就要区分各个设备了,Linux每个设备都有一个设备号,设备号有主设备号和次设备号两部分组成,主设备号表示某一具体的驱动,次设备号表示使用这个驱动的各个设备。linux提供了一个名为dev_t的数据类型表示设备号,dev_t类型是一个无符号32位数据类型,也就是说其设备号的范围是0到4095,在进行设置时也不要超过这个范围。分配方式有静态分配和动态分配两种,一个是直接给他一个固定的号,另外一个是根据检索系统中使用的设备号,挑选一个没有使用的进行分配使用,动态分配法,可以避免冲突的发生。
|