第五章
本章主要学习关于开发板的测试环境,由于我们所开发的Linux驱动,不管使用何种方法编译后,都需要在开发板上进行测试,这是因为在ARM架构的开发板可以在X86架构的PC在CPU指令及二进制格式上有所不同 ,而且在Linux所需要的硬件在PC上很难进行模拟,因此要在开发板上进行调试和测试。
本章主要介绍了S3C6410开发板,这是一款低功耗、高性价比的RISC,可广泛应用于移动电话和通用处理等领域。
安装串口调试工具minicom的步骤:1、检测当前系统是否支持usb转串口;2、安装minicom;3、配置minicom;4、测试minicom。
烧写Android系统的步骤:1、插入读卡器并连接PC;2、向SD卡中写入mmc.bin和zImage-sd.bin;3、将相关文件复制到SD卡上,然后按照规则设置开发板上的启动开关;4、开始从SD卡烧写Android;5、校准屏幕。
第六章
本章刚开始对Linux驱动进行了详细说明并简单介绍了编写Linux驱动程序的步骤,然后通过一个“统计单词个数”的例子对驱动程序开发的相关操作进行了详细地说明,最后又介绍了测试开发出来的驱动程序的各种方法。
编写驱动程序的步骤:1、建立Linux驱动骨架;2、注册和注销设备文件;3、指定与驱动相关的信息;4、指定回调函数;5、编写业务逻辑;6、编写Makefile文件;7、编译Linux驱动程序;8、安装和卸载Linux驱动。
测试Linux驱动的方法有:1、使用Ubuntu Linux测试Linux驱动;2、在安卓模拟器上通过原生C程序测试Linux驱动;3、使用Android NDK测试Linux驱动;4、使用Java代码直接操作设备文件来测试Linux驱动;5、使用S3C6410开发板测试Linux驱动;6、将驱动编译进Linux内核进行测试;
第七章
本章主要学习了LED驱动,LED驱动是本书第一个真正和硬件打交道的的Linux驱动。虽然LED驱动并不复杂,只是控制了4个LED,但LED驱动已经包括了Linux驱动所有必要的成分。一个完整的Linux驱动主要由内部处理和与硬件交互两部分组成。其中内部处理主要是指Linux驱动的装载、卸载、与设备文件相关的动作处理,以及业务逻辑等。与硬件交互主要是指通过IOWRITE32、ioread32等函数与硬件中的寄存器进行数据交互。Linux驱动在不同平台的移植也是处理这两部分。如果在不同Linux内核版本之间的移植,主要是移植第一部分,如果在不同硬件平台的移植,主要是移植第二部分。
尽管linux驱动直接与硬件打交道,但并不是linux驱动直接向硬件中的内存写数据,而是与本机的I/O内存进行交互。由于misc_register函数只能建立主设备号为10的设备文件,如果想建立其他主设备号的设备文件,就需要使用cdev_init、register_chrdev_region、cdev_add等函数:初始化cdev。cdev的大多数成员变量并不需我们自己去初始化,只要调用cdev_init函数即可;指定设备号;使用cdev_add函数将字符设备添加到内核中的字符设备数组中;使用class_create宏创建struct class;使用device_create函数创建设备文件。
第八章
本章主要讲的实例是蜂鸣器驱动程序,蜂鸣器是S3C6410开发板上自带的一个硬件设备。可以通过向寄存器写入特定的值来控制蜂鸣器发出的尖叫声。介绍了蜂鸣器的实现原理,并实现了一个完整的蜂鸣器驱动。
在某些情况下,linux驱动无法正常卸载,需要强行卸载,但是本章的方法不能强行卸载所有的linux驱动模块,只能卸载由于异常情况而导致的linux驱动模块无法卸载情况。比如:
初始化函数崩溃,这种情况的表现是当前linux驱动模块没有被任何其他的linux驱动模块使用,但却显示已经被引用了一次。解决方法把是当前的linux驱动模块的引用计数器清零即可。上次在荆老师的实验课上做这个实验的时候就遇到过这个问题,开发板一直发出响声无法关闭,只能通过重启开发板来避免,但一直重启开发板很是麻烦,试验一次就要重启一次,通过本章的学习就能很好地解决这个令人困扰的问题了。