
Linux驱动学习
文章平均质量分 57
基于韦东山的Linux驱动实验班视频,记录一下学习过程。
陈和权
这个作者很懒,什么都没留下…
展开
-
6.实战SR501人体红外感应,引入中断和异步通知
这个模块有人会输出高电平,无人会输出低电平,按照之前的方法read话,只能获取当前状态,需要一直轮询才能实时知道有人无人的变化,中断是一种高效的机制,能够在保证系统响应速度的同时,最大限度地提高 CPU 资源的利用率。在共享中断的情况下,用于区分是哪个设备引发了中断。这里我并没有一直在读取sr501的电平,是硬件电平变化产生了一个中断后,由cpu去唤醒对应的中断处理函数,细节就不深究。: 表示需要唤醒一个线程来处理该中断,用于更复杂的处理逻辑。:指向设备的指针,用于共享中断的情况下区分设备。原创 2024-07-23 11:51:29 · 431 阅读 · 0 评论 -
5.操作led
确定好GPIO编号后,接下来就是要确定led驱动程序的功能,这里我希望它能开关led,以及能读取led的状态。套用到我们的驱动程序中就是,在init函数中请求GPIO并设置方向为输出,在exit函数中释放GPIO,在read函数中获取GPIO的值,在write中设置GPIO的值。gpio_get_value读,gpio_set_value写。gpio_direction_input输入,gpio_direction_output输出。想要操作led,首先要找到原理图,查找GPIO对应的GPIO引脚。原创 2024-07-17 14:59:40 · 194 阅读 · 0 评论 -
4.自动生成class和device
现在insmod驱动后,就会在/dev/下自动生成hello节点(/dev/hello),/sys/class/下生成hello目录并在hello目录下生成一个hello设备的信息目录(/sys/class/hello/hello)第三章里面,我们使用mknod创建设备节点,常规操作是在驱动init的时候就创建好,使用class_create和device_create创建。原创 2024-07-01 11:33:15 · 240 阅读 · 0 评论 -
3.用户程序与驱动交互
用户app与驱动交互最常见的做法是insmod驱动后,生成一个设备节点,app通过open,read等系统调用去操作这个设备节点,这里先用mknode命令调试。使用mknode后生成了/dev/hello节点,写入数据到hello节点中,查看dmesg的输出发现调用了驱动的open write release。分别调用 ./hello_test /dev/hello 123 和 ./hello_test /dev/hello 后,查看dmesg输出显示。驱动程序请使用第二章。原创 2024-06-28 17:40:05 · 1296 阅读 · 0 评论 -
2.最简单的hello驱动
第三步实现这些read,write等函数。点到file_operations结构体定义的地方,把函数原型复制过来,例如read函数,改写一下成hello_read,依次把write,open,release函数补上,这里不操作任何东西,添加一些打印即可。第四步实现init和exit函数,这里我参考的是/Linux-4.9.88/drivers/char/mbcs.c中的init和exit。写驱动最快的方法就是抄内核中的其他驱动,这里选择的是/Linux-4.9.88/drivers/char/mem.c。原创 2024-06-28 11:12:43 · 260 阅读 · 0 评论 -
1.驱动程序框架
在linux下,一切皆文件。当我们write一个文件时,内核通过文件的file_operations结构体(include/linux/fs.h)来找到对应的驱动函数,最终调用的是存储介质(ssd,硬盘等)驱动提供的write函数(这中间有很多步骤暂时先不关注)。不同的驱动要提供自己的open,read,write,ioctl等接口。当驱动insmod的时候,通过model_init()宏来初始化驱动。当驱动rmmod的时候,通过model_exit()宏来清理驱动。驱动是用来控制和操作硬件的软件。原创 2024-06-28 09:40:42 · 201 阅读 · 0 评论