
简介
该用户还未填写简介
擅长的技术栈
可提供的服务
暂无可提供的服务
在linux 驱动中创建设备文件
这样内核打开相关驱动文件之后,驱动读取设备树文件dtsi就知道SPI总线用的是40Mhz的时钟晶振,spi 的sclk 20MHZ,中断,读是哪个IO口。总而言之,PCB 软件用画原理图来表明这个设备的情况,设备树是通过语言的方式描叙硬件的状态。具体设备树怎么写一般下载内核后在DOCUMENT下面查找各个内核的设备树,照说明写。这个系列没有说中断,DMA,SPI,UART,IIC等,也没说网络设备
关于这个unlocked_ioctl 以及它和早期的linux 内核中的ioctl() 见其他大佬的说明。ioctl,字面意思是输入输出控制,lesson12 里面对这个玩意的作用说了个清除,超越常规的r/w/open/close 操作之外,设备文件有时候需要更多的参数来配置控制。lesson12 复制的是lesson8/9的代码,给了cdev_init(&my_cdev,&fops) 中fops
两个程序都写完了,视频开始编译驱动程序,insmod之后,mknod/dev/hello0从236 0;最后在应用层跑测试,分别做这两个字符设备,打印不同的次设备号,不同模式,表明测试程序成功。这几个课程加起来就是对字符设备常用的操作开,关,读,写的操作,构成了字符设备的开发架构。我认为字符设备其实都可以理解为在这个架构上开发的。和lesson5 对比,十分类似,lesson5 只实例化了.rea
register_chrdev_region 需要配置主/副设备号,这里用的 STATIC_DEVNR ,MINORMASK+1 来注册字符设备 hello_cdev。不过这节系统内核添加hello_cdev这个设备驱动之后还是要mknod 创建字符设备 mknod /dev/hello0 c 236 0。这样系统内核就添加字符设备,在 /proc/dev/中可以看到字符设备 hello_cdev
malloc/free 在c 里面很常见的成对出现,用于申请内存空间和释放内存空间,这里的kmalloc/free 成对出现在open/release 里面。然后read/write 函数里面就是copy_to_user()/user_to_copy()。不看视频,直接看这个程序,能理解这个程序是注册了一个字符设备文件,打开字符设备文件就会申请下一段64bit(MEMSIZE)内存空间,从外部用户
在 Linux 中一切设备都是文件,系统用文件的开关读写抽象了设备的操作,所以 <linux/fs.h> 中的 file_operation 至关重要。查看 Linux 系统的 /dev/ 文件夹,查看设备文件和文本文件的不同。实际上 /dev/ 下的设备文件大多都是虚拟文件,关闭树莓派之后,PC 查 SD 卡可以看到 /dev/ 文件夹大多是空的。举例 /dev/gpiochip0 的主设备号
fs.h中的读是ssize_t (*read) (struct file *, char __user *, size_t, loff_t *),例子里面是my_read(struct file *f, char __user *u, size_t l, loff_t *o),可见参数是可以重写的;lesson6 printk 的各种报告等级。学过stme32单片机的,可以理解为<linux/fs
shell 表示shell 脚本,uname -r 表明系统的内核版本,/lib/modules/$(shell uname -r)/build等于表达内核目录,相当于开发路径。所以这个命令等于 make -C /lib/modules/xxx/buildM=xxx(当前目录) modules。module.h 提供内核动态加载移除,init.h 提供内核函数如何加载移除。程序最后是内核开发的MO
将初始化和移除的函数添加了static 关键字,保证函数my_init() /my_exit()只能在这个hello.c文件中调用,显然安全程度高了很多。添加MODULE_AUTHOR/MODULE_DESCRIPTION 添加了模块说明,以后可以用modinfo等命令查看模块信息。这个hello.c就是最简单的linux 内核驱动模块程序了。解释了加载/移除 驱动模块 ,加载模块之后如何查看内核








