- 博客(16)
- 收藏
- 关注
原创 Linux驱动开发之中断处理
在驱动程序中我们不乏使用中断机制,中断属于异常的一种,一般用于打断当前线程,进而去执行比较紧急的事件,当紧急事件处理完成再回来继续执行前面线程工作的一种机制。中断的应用在驱动程序中比较常见,比如按键驱动、触摸屏驱动都用到中断机制。中断还有底半部机制,用来处理耗时较长的任务,可以提高驱动执行效率。中断的底半部有多种实现方式比如tasklet机制与工作队列机制(work queue)以及中断线程化。linux内核中不支持中断嵌套操作。
2025-03-14 21:35:33
781
原创 基于IMX6ULL的安防监控项目
该项目主要应用的技术是boa服务器的移植及使用,mjpg-streamer库的移植,该库是控制摄像头数据采集的神器,在需要使用使用摄像头的地方可以将部分代码移植过来使用。使用到了多线程技术,还有进程间通信的消息队列,还有进程的同步与互斥机制互斥锁和条件变量的使用。在底层需要LED灯与蜂鸣器的驱动代码,还有ov5640摄像头驱动的移植。当然,在这个项目的基础上可以增加其他功能,比如温湿度,烟雾报警、光传感器等等。就是在该基础上增加传感器的驱动以及处理逻辑,问题不大。
2025-03-12 19:18:35
902
原创 Linux设备驱动开发之摄像头驱动移植(OV5640)
这里用的是NXP提供的原厂linux内核源码,目的是学习ov5640相关摄像头驱动的移植。
2025-03-05 23:11:34
952
原创 Linux驱动开发之串口驱动移植
从上图可以看到RS232的串口接的是UART3,接下来我们需要使能UART3的收发功能。一般串口的驱动程序在内核中都有包含,我们配置使能适配即可。
2025-03-03 21:47:14
368
原创 Linux驱动开发之触摸屏驱动(GT911)
devm_request_threaded_irq是Linux内核的一个函数,用于请求并注册线程化的中断处理。它接受中断号、主处理函数、线程处理函数等参数,中断处理分为快速处理和线程化执行,便于管理复杂操作。该函数利用devm机制自动管理资源,防止泄漏。每个参数的含义:struct device *dev: 指向表示设备的 struct device 结构体的指针。unsigned int irq: 中断号,表示要请求和注册的中断线路。
2025-02-26 22:23:23
1069
原创 Linux驱动开发之I2C设备驱动(ap3216c)
由上面原理图可知,AP3216C设备挂在I2C1总线上:在内核源码目录下搜索:在I2C1控制器节点添加ap3216c设备节点: 根据ap3216c芯片手册编写驱动代码,芯片手册的主要数据如下: 应用层测试代码参考 Makefile文件参考驱动代码验证将make生成的ap3216c.ko文件与test文件拷贝到开发板,进行功能验证:
2025-02-17 22:52:31
641
原创 Linux驱动之LCD屏幕驱动移植及应用
这里以IMX6ULL开发板为例,NXP已经提供完整的LCD驱动,我们需要修改设备树,使该驱动正常工作。
2025-02-14 18:08:07
1139
原创 Linux驱动开发之温度传感器(ds18b20)
选择一个没有被使用的IO口来驱动ds18b20,这里选择GPIO_2为例子: 在linux源码目录下查找IO复用配置: 在数据手册查找gpio电器属性配置寄存器,驱动ds18b20一般可以配置成上拉电阻开漏输出特性:将上面配置00111 1000 0110 1001转换成16进制:0X7869。添加设备树节点如下: make dtbs生成设备树文件,拷贝到开发板替换原来设备树文件,重启开发板。 先编写platform平台总线驱动框架,保证device与driver
2025-02-14 07:00:00
788
原创 Linux驱动开发延时操作与定时器
所谓忙等待类延时就是白白消耗CPU的时间来达到延时的目的。如果没有特殊理由(比如在中断上下文或获得自旋锁的情况下),不推荐使用这些函数延迟较长时间。ndelay、udelay和mdelay分别表示纳秒级延时、微秒级延时和毫秒级延时。查看代码,在ARM体系结构下,ndelay与mdelay都是基于udelay的。
2025-02-09 17:35:54
1065
原创 Linux驱动开发IO操作之阻塞与非阻塞
当应用程序通过read读取或write写入设备文件的某些数据时,就会调用驱动程序的read或者write函数,此时可能会遇到没有数据可读或者写满的情况,这时如果驱动程序会进入睡眠,当有数据可读或者可写的时候唤醒再返回,我们称这种操作为阻塞IO。
2025-02-08 19:56:48
1055
原创 Linux字符设备驱动框架
是一个用于创建一个新的设备类的函数。驱动的入口函数一般是由module_init()来指定,驱动的出口函数一般由module_exit()函数来指定。当加载驱动程序时,驱动入口函数的代码开始执行,当卸载该驱动程序时,驱动出口函数得到执行。在驱动入口函数中一般是驱动初始化代码,比如申请设备号,创建字符设备,自动创建设备节点等。传入cdev 结构的指针,起始设备编号,以及设备编号范围,成功返回0,失败返回负数。如果请求的设备编号范围太大,可能会导致溢出到下一个主设备号,但只要编号范围可用,操作仍然会成功。
2025-02-06 17:54:09
1107
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人