Linux驱动开发

Linux驱动如何学习和理解,借用大神总结的话,在此记录下,我初次看时感觉很受用,理解的很到位:

上层是文件系统和应用,中层是Linux内核,下层是底层硬件,Linux驱动是介于文件系统和底层硬件之间的,是嵌入到内核中的程序,应用是嵌入到文件系统中的程序,比如Android APP。

对上:Linux设备驱动给上层提供调用的接口;

对中:Linux设备驱动要注册到内核中,标准说法是 挂载在总线上;

对下:直接操作硬件,如GPIO、IIC、SPI、PWM等;

以上三个,Linux内核都提供了大量的接口函数、结构体,其实Linux驱动,就是掌握了这些东西怎么用,适应到自己要写的驱动程序中。

Linux代码风格

Linux 内核中处处体现面向对象的设计思想,为了统一形形色色的设备,Linux 系统将设备分别抽象为struct cdev, struct、block_device,struct net_devce 三个对象,具体的设备都可以包含着三种对象从而继承和三种对象属性和操作,并通过各自的对象添加到相应的驱动模型中,从而进行统一的管理和操作。

Linux字符设备

Linux 内核中将字符设备抽象成一个具体的数据结构(struct cdev), 我们可以理解为字符设备对象,cdev 记录了字符设备的相关信息(设备号、内核对象),字符设备的打开、读写、关闭等操作接口(file_operations),在我们想要添加一个字符设备时,就是将这个对象注册到内核中,通过创建一个文件(设备节点) 绑定对象的cdev,当我们对这个文件进行读写操作时,就可以通过虚拟文件系统,在内核中找到这个对象及其操作接口,从而控制设备。