说明
本文为朱老师课程学习笔记
结构
- 应用
- API:open,close,read,write
- 驱动:实际的函数
- 硬件
驱动的表示
驱动实际上是一组(读写硬件寄存器的)api的组合
存到一个结构体里
file_operations
static const struct file_operations i2cdev_fops = {
.owner = THIS_MODULE,
.llseek = no_llseek,
.read = i2cdev_read,
.write = i2cdev_write,
.unlocked_ioctl = i2cdev_ioctl,
.open = i2cdev_open,
.release = i2cdev_release,
};
函数指针,实际函数的地址
一个设备,对应一个结构体变量
驱动向内核注册时提供该结构体类型的变量
注册
驱动向内核注册,上面的结构体file_operations
内核把file_operations,放到数组里
//register_chrdev使用示例
//I2C_MAJOR主设备号,传0代表内核自动分配
res = register_chrdev(I2C_MAJOR, "i2c", &i2cdev_fops);
cat /proc/devices查看内核中已经注册的
整体过程
insmod
xxx_init
register_chrdev
应用程序调用驱动
设备文件
硬件,被抽象成文件,放在/dev下
查看设备号 ls -l /dev/xxx
第一个字母,b块设备,c字符设备
设备号:8主设备号,0次设备号
用户空间和内核数据交互
//kbuf内核空间的
//ubuf用户空间的
copy_from_user(kbuf, ubuf, count);
copy_to_user(ubuf, kbuf, count);
过程总结
2.6的内核
insmod,调xxx_init;lsmod,显示出加载的驱动
在xxx_init里调用register_chrdev;用cat /proc/devices显示注册的设备及设备号
创建设备文件mknod /dev/xxx c字符设备 主设备号 次设备号
应用可以open,并write或read