Android深度探索5-7章总结
介绍了S3C6410开发板的功能,开发板的不同主要是在烧录嵌入式系统的方式不同,以及如何在此开发板上安装Android。紧接着学到介绍到如何在多种平台,使用多种方式测试Linux驱动。给出的实例是统计单词的个数,但是关键还在实现该算法的技术是Linux驱动。这个实例让我了解到Linux驱动的完整开发过程。
Linux 驱动的工作和访问方式是 Linux 的亮点之一,Linux 系统将每一个驱动都映射成一个文件。这些文件称为设备文件或驱动文件,都保存在/dev目录中,由于大多数Linux驱动都有与其对应的设备文件,因此与Linux驱动交换数据就变成了与设备文件交换数据。
将驱动编译进Linux内核进行测试,动态装载驱动模块不会随着Android系统的启动而自动装载,因此Android系统每次启动都必须使用insmod或modprobe命令装载Linux驱动模块。可以使用如下的步骤将word_count驱动加入Linux内核源代码树。将word_count.c文件放入Linux内核源代码,将word_count.c文件放到<Linux内核目录>/drivers/char目录中,修改Kconfig文件,修改Makefile文件,打开/root/kernel/goldfish/drivers/char/Makefile文件,设置.config文件,
.config文件可以通过手工配置,也可以通过make menuconfig命令在菜单中配置,编译Linux内核,进入/root/kernel/goldfish目录,执行下面的命令编译Linux内核,# make,建立新的Kconfig文件,在word_count目录中建立一个Kconfig文件。
接下来是控制发光二极管来演示如何开发一个完整的Linux驱动。这个驱动用来控制4个LED小灯。也就是说通过向Linux驱动发送数据可以控制LED灯的开关.LED驱动包含了Linux驱动所有必要的部分。一个完整的Linux驱动主要由内部处理和硬件交互两部分组成。其中内部处理只要是指linux驱动的装载、卸载与设备文件相关的动作处理包括读写设备文件、向设备文件发送I/O命令等动作和业务逻辑。
创建设备文件,使用cdev_init函数初始化cdec,大多数的成员变量不需要我们自己初始化,调用cdev-init函数即可。描述设备文件需要一个cdev结构体,指定设备号,分别指定主从设备号,所以需要MKDEV宏
int dev_number=MKDEV(major,minor);使用cdev_add函数将字符设备添加到内核中的字符设备数据中,调用cdev_add函数需要指定设备文件指针(p)、设备号(dev)、设备文件数量(count)还调用了一个重要的函数kobj_map,使用class_create宏创建struct class,Struct class包含了一些与设备文件有关的变量和一些回调函数指针变量。
卸载LED驱动的设备文件,依次调用decive_destory、class_destory、unregister_chrdev_region方法。Led_destory_device函数用于卸载LED驱动的设备文件,leds_exit函数是LED驱动的卸载函数,通过调用Led_destory_device函数来完成卸载LED驱动设备文件的工作。
设置LED等的状态,设置寄存器和初始化LED驱动,通过设置寄存器的值可以设置LED引脚的状态以及控制其亮灭。然后要控制LED,可以通过字符串和I/O命令。使用字符串用到file_operations.write函数,使用I/O命令用到file_operations.ioctl,从用户空间像内核中写入数据用到的函数copy_from_user。
与硬件交互主要是指通过iowrite32、ioread32的等函数与硬件中的寄存器进行数据交互。Linux驱动在不同平台上的移植也包括这两部分。不同linux内核版本之间的移植,主要移植的是linux驱动的内部处理。,一般内核差别较大时,linux内核的API也会有很大的差别;但是如果在不同的硬件平台,主要移植的是第二部分。当然,在一些情况下,linux驱动移植基本相当于重新编写一边linux驱动,需要一步一步不断的学习,才可以更好的了解linux驱动的高级技术。
http://www.cnblogs.com/xxyue/