android底层开发流程_从linux驱动到APK调用_图文详解
第一步:在 Linux 下编写驱动程序
1,在 Linux3.0/driver/ ->mkdir hello_me
2,在 hello_me 目录下,新建编写 makefiel 和 Kconfig
makefile 如下:
[csharp] view plaincopyprint?
1. #
2. # Makefile for HELLO_ME_LEDS
3. #
4.
5. # SPI testing only for (using spidev driver)
6. # \file -> spi_test.c
7.
8. # \version 1.0.0
9.
10. # \date 2014年 04月 23日
11.
12. # \author jiangdou
13.
14. # Copyright (c) 2014 jiangdou. All Rights Reserved.
15.
16. obj-$(CONFIG_HELLO_ME_LEDS) += leds.o64. .owner = THIS_MODULE, /* 这是一个宏,推向编译模块时自动创建的__this_module变量
*/
65. .open = led_drv_open, /*函数指针赋值*/
66. .write = led_drv_write, /*函数指针赋值*/
67. };
68. /*主设备号变量*/
69. int major;
70. /*当执行 insmod命令的时候这个函数会被执行 */
71. static int led_drv_init(void)
72. {
73.
74.
75. pr_err("leds_init by jiangdoun");
76. /*注册一个 LED设备,参数 0表示让操作系统分配主设备号,分配好了之后返回给 major */
77. major = register_chrdev(0, "jiangdou_led", &led_drv_fops);
78. /*创建设备节点,有了这两个函数,我们在文件系统里面就会看到/dev/led */
79. leddrv_class = class_create(THIS_MODULE,"jiangdou_led");
80. device_create(leddrv_class,NULL,MKDEV(major,0),NULL,"jiangdou_led");
81. /*linux系统里面都是虚拟地址 ioremap就是将虚拟地址转换为物理地址,然后我们可以对寄存器
进行操作
82. *第一个参数表示需要映射的基地址,第二个参数表示长度,即基地址+0×10*/
83. gpe_cfg0 = (volatile unsigned long *)ioremap(GPE_CFG0,20);//20表示 20 byte,5个
32
84. // /*0×A0 = 0×90 +4*4*/
85. gpe_date = gpe_cfg0 + 4;
86. return 0;
87. }
88. /*当执行 rmmod的时候会被执行*/
89. static void led_drv_exit(void)
90. {
91. /*注销 LED设备*/
92. unregister_chrdev(major, "led"); // 卸载
93. /*释放申请的地址*/
94. iounmap(gpe_cfg0);
95. /*销毁创建的设备节点*/
96. device_destroy(leddrv_class,MKDEV(major,0));
97. class_destroy(leddrv_class);
98. printk(KERN_ALERT"leds unregister\n");
99. }
100./*linux设备驱动的两个修饰符*/
101.module_init(led_drv_init);
102.module_exit(led_drv_exit);103.
104./*遵循 GPL协议*/
105.MODULE_AUTHOR("by jiangdou");
106.MODULE_LICENSE("GPL");
5,在 Linux3.0/driver/makefile 的修改,如下:
[cpp] view plaincopyprint?
1. #
2. # Makefile for the Linux kernel device drivers.
3. #
4. # 15 Sep 2000, Christoph Hellwig
5. # Rewritten