第一次分析内核源代码,整个内核代码绕来绕去,人比较容易晕,而且深入追踪几次后不知道自己要干什么呢?自己看内核代码,看驱动,上网搜资料也有好一段时间了,大概总结一下自己的一些心得,很简单的,不是写驱动的心得,而是怎么去查看,最近看UART终端设备驱动,就以这个为例吧。
第一,弄清楚主要结构框架
这人是大概弄清楚主要框架,流程,一般linux内核驱动都是封装,分层,抽象,继承的,所以要弄个大概,知道几个关键的结构,当然要完全弄清楚了,那就是高手了,后面肯定都没什么问题了,我是新手,弄个大概就可以啦。以UART终端设备为例,需要大概知道总线,设备,驱动的层次,然后是platform总线,platform设备和platform驱动的关系,以及里面几个重要的结构,像tty_operations tty_driver tty_struct 以及uart核心层的uart_ops , uart_driver , uart_port等等一些中重要的结构,这个的话网上有很多很详细的文章。
第二,弄清楚主要流程
像总线,设备,驱动的话,这个大概的流程就是要注册总线,然后注册设备,然后注册驱动(当然这里设备和驱动注册没有先后之分,也可以先注册驱动在注册设备),然后总线就调用驱动去匹配(match)设备与驱动,匹配成功后就调用驱动中的探测(probe)函数初始化设备。
第三,弄清楚驱动在内核中的位置
这个我不知道别人遇到过没有,反正我是遇到了,而且还比较棘手,我不知道相关的驱动的源代码在哪里,都说驱动的话一般只是去修改一些内核中的代码,但是我连这个代码都不知道在哪里,用个source insight在内核代码中找来找去的,内核代码太多无法找啊。现在总结几点,一个要修改的主要几个大的目录就是arch,driver暂时我还只用到这俩个目录,然后一边与硬件相关的基本在arch里面,当然主要看的是arch里面对应的平台和driver里面所对应的驱动里面去查找。
第四,看Makefile与Kconfig文件
看这俩个文件,主要是定位到这个驱动设计到的一些其他核心的文件,比如一些已经抽象好的一些接口等等,都可以在这里找到文件。
第五,UART资源的一些具体的目录
1、首先是UART设备的resource资源分配的文件,这个我觉得比较重要,因为以后这部分可能最需要修改的
arch/arm/plat-s3c24xx/devs.c
这个目录包含了platform设备资源的分配
2、platform设备的注册与s3c2440的配置文件
arch/arm/mach-s3c2440/mach-smdk2440.c
这个文件包含了大部分的platform设备的注册以及很多的设备的配置,比如lcd的一些参数配置
3、arch/arm/plat-samsung/dev-uart.c 定义了串口设备对应的平台设备
4、arch/arm/mach-s3c2440/mach-smdk2440.c中有串口一些寄存器的初始化配置
5、arch/arm/plat-s3c/init.c这个函数里面注册了串口设备,这个文件主要是初始化cpu,时钟,串口等等,串口的初始化放在这里应该也是有道理的。
阅读(3423) | 评论(0) | 转发(2) |