驱动开发
文章平均质量分 67
Vartimes
这个作者很懒,什么都没留下…
展开
-
linux-3.4.2 的v4l2驱动框架分析
应用程序调用时,其实就是去打开__video_register_device里注册的字符设备文件,本质上就是去调用v4l2_fops里的那些函数,例如当打开一个文件时,就会调用v4l2_fops的open函数,open函数里会通过打开的文件属性获得数组下标找到video_device,在进行相关判断后会调用video_device的fops的open函数,也就是vivi_template的fops的open函数,其他读写函数调用也是如此。__video_register_device注册时存放到数组里的。原创 2023-08-21 17:29:03 · 365 阅读 · 0 评论 -
内核驱动调试常用方法
当然,如果内核没有打印回溯信息,自己可以通过栈信息推导出调用链,因为当前错误指令地址会被打印,而通过该指令可以具体定位到是哪个模块的函数出了错(剧吐定位方法和前面说过的一样),然后反汇编该模块,通过对照汇编码和栈信息就可以找出该函数的lr寄存器保存的调用函数下一条指令的pc值,该pc一定属于调用函数的一本分,通过搜索就可以找到调用函数,依次按此方法进行递归查找,最终就会找到一条完整的调用关系链。前面我们说了裸机调试常用方法,当然,在linux内核上进行驱动开发也也有常见方法。一般为打印法(printk)原创 2023-07-04 11:50:56 · 480 阅读 · 0 评论 -
驱动开发之常见裸机调试方法
所谓点灯法就是在没有串口打印的情况下,如果要找到某段代码哪里出了问题,则用一段可使led灯亮的断码放在该段代码某处,如果led亮则证明该位置之前的断码没有问题,然后继续挪动点灯代码,直到找到一个led不能亮的位置,则该位置之前的代码就是问题代码。软件断点流程为:如果需要把数据为123的某地址设为断点,那么就把地址A或B的数据修改为123即可,这样当运行到A或B地址处就会产生断点,当然这样做提前提前保存A或B地址处的值,断点后需要恢复A或B处的值。.当jtag的地址等于某个值时,让cpu停止(硬件断点)原创 2023-07-03 20:52:37 · 643 阅读 · 0 评论 -
linux-2.6.22.6内核i2c驱动框架源码分析
接下来就是发数据了,这个过程是由8个数据位和一个ack位组成,如果是读,这8位数据由从机驱动,第9位ack由主机发出(因为此时是主机向从机读数据,主机需要确认是否收到数据),如果是写,则这8位由主机驱动,第9位ack由从机发出,发数据这个过程是可以反复进行的,一旦发送或者读取完成,主机就会发出一个停止信号(SDA由低变高)来结束通信,这所有的过程都是在SDA上进行的。开发一个i2c驱动时,我们只需关心从设备部分,主要提供主机控制器操作所需要的从设备信息,这就是另一部分。i2c框架主要分为两大部分,原创 2023-07-01 17:07:12 · 558 阅读 · 0 评论 -
linux-2.6.22.6内核网卡驱动框架分析
cs89x0_probe1里又进一步对net_device 进行了填充,其中hard_start_xmit 就是发送数据函数,然后通过register_netdev进行注册。入口函数里,首先分配了net_device 结构体,然后对该结构体进行进行填充,最后调用cs89x0_probe1进行下一步处理。总结:发送数据和接受数据是通过hard_start_xmit 和netif_rx完成的,而数据的载体都是sk_buff 结构体。net_interrupt里又调用net_rx(dev);原创 2023-07-01 09:38:48 · 225 阅读 · 0 评论 -
linux-2.6.22.6内核nand flash框架分析
总结:块设备和字符设备这两类存储类驱动最终都会用到nand_scan_tail里面构造的mtd_info信息,最终的的读写函数都会定位到mtd_info的具体函数,不过块设备更复杂,分层更多,它主要分为硬件层、nand协议层和块设备层,硬件层知道怎样发命令,需要构造nand_chip结构体,协议层知道要发什么来操作。主要构造mtd_info结构体,块设备层使用mtd_info信息,并用电梯调度算法进行优化。原创 2023-06-29 18:29:14 · 251 阅读 · 0 评论 -
linux-2.6.22.6内核总线设备驱动模型
在led_probe里获取了device信息,并创建了设备信息,应用程序就可依此进行相关操作。开发一个驱动程序时,不免涉及到对硬件的相关操作,例如读取寄存器和引脚,在不利用任何框架的基础上,硬件代码总是和其他操作耦合到一块,这样做的坏处是代码耦合性太强,例如有三盏led灯,驱动程序每次只打开一盏灯,就如想换盏灯打开,那么每次都得修改寄存器和引脚等硬件相关的信息,由于对硬件的操作是通用性的,而这些操作和硬件本身的信息封装在了一块,所以这种修改可能会对这些通用操作产生影响。原创 2023-06-25 17:24:16 · 189 阅读 · 0 评论