虽然成功控制了PH17脚输出高低电平,但是我感觉什么都没有获取到(关于Linux的字符设备驱动)。
打算把驱动直接编译进内核,首先看看怎样把自己的驱动添加到内核配置界面上。打开内核配置界面,在lichee/linux-3.4目录下输入make ARCH=arm menuconfig。
Device Drivers --->
Character devices --->
CQA20 LED driver support
再lichee/linux-3.4/drivers/char目录下输入grep -r "CQA20 LED driver support" *,看看能找到什么,输出信息如下:
捕获.PNG (9.77 KB, 下载次数: 36)
2016-11-16 18:07 上传
[img]C:\Users\BruceLee\AppData\Local\YNote\data\2377933161@qq.com\5c3d0fbfc5fb4930b067ffccf764fd6a\捕获.png[/img]
查看Kconfig文件中CQA20 LED driver support相关内容,信息如下:
捕获.PNG (45.02 KB, 下载次数: 36)
2016-11-16 18:08 上传
[img]C:\Users\BruceLee\AppData\Local\YNote\data\2377933161@qq.com\e2c96d2a54d14cee8bdf319f9d6b7e6d\捕获.png[/img]
估计仿照上面的内容添加自己的内容就可以在内核配置界面上添加自己的驱动选项。添加内容如下:
捕获.PNG (30.13 KB, 下载次数: 45)
2016-11-16 18:09 上传
[img]C:\Users\BruceLee\AppData\Local\YNote\data\2377933161@qq.com\3f5c937330bd4229ba6a1495ae0005e1\捕获.png[/img]
在lichee/linux-3.4目录下重新运行make ARCH=arm menuconfig,可以在内核配置菜单下看到多了My first LED driver support 选项,如下图所示:
捕获.JPG (45.76 KB, 下载次数: 35)
2016-11-16 18:13 上传
[img]C:\Users\BruceLee\AppData\Local\YNote\data\2377933161@qq.com\63e7ad86ed9945b5852791dfc26c06b9\捕获.jpg[/img]
通过空格键选择为*,编译进内核。
虽然现在还没有创建myled.c文件,编写驱动代码,假如创建了,编译系统怎么知道去编译这个文件呢?可能跟刚才在内核配置界面的选择有关,但是根据以往经验,也有可能跟Makefile有关,看看Makefile里有什么。在Makefile里搜索LED,可以找到如下内容:
捕获.JPG (26.09 KB, 下载次数: 42)
2016-11-16 18:13 上传
[img]C:\Users\BruceLee\AppData\Local\YNote\data\2377933161@qq.com\9d48fc264cd64d70876d81f6f6e1cc10\捕获.jpg[/img]
在Kconfig里,写的是CQA20_LED,这里变成了CONFIG_CQA20_LED,这是为什么呢?搜索一下,结果如下:
捕获.JPG (51.04 KB, 下载次数: 39)
2016-11-16 18:14 上传
[img]C:\Users\BruceLee\AppData\Local\YNote\data\2377933161@qq.com\0ba6d26cb054474faed58e175b18f10e\捕获.jpg[/img]
从上面的结果来看,估计CONFIG_CQA20_LED是通过内核配置界面生成的一个变量,但是这么多目录下都有,哪一个才是通过内核配置菜单生成的,或者说全部都是呢?搜索一下CONFIG_MyLED看看有什么结果。在/lichee/linux-3.4目录下输入grep -r CONFIG_MyLED *结果什么都没有。试试查看上面个文件的修改时间看看有什么发现。结果如下:
捕获.JPG (60.21 KB, 下载次数: 43)
2016-11-16 18:15 上传
[img]C:\Users\BruceLee\AppData\Local\YNote\data\2377933161@qq.com\ac3b833c404d4e7899bbd2f165588c1f\捕获.jpg[/img]
今天是2016/11/16而上面只有output/.config文件的最近修改日期是2016/11/15,其它文件的日期是2015年,并且我昨天刚好编译过内核,所以为了验证CONFIG_CQA20_LED是一个编译的时候生成的变量,可以先编译一下内核然后在搜索CONFIG_MyLED。在/lichee/linux-3.4目录下输入./build -p sun7i_android -m kernel,编译完后输入grep -r CONFIG_MyLED *输出结果如下:
捕获.JPG (30.67 KB, 下载次数: 36)
2016-11-16 18:15 上传
[img]C:\Users\BruceLee\AppData\Local\YNote\data\2377933161@qq.com\cb7133bcbc304fb68d54abb24e284ed6\捕获.jpg[/img]
虽然结果跟上面的猜测有点出入,但是可以确定CONFIG_MyLED是编译的时候生成的变量,而且会生成多个文件。
现在可以放心地回到/lichee/linux-3.4/drivers/char目录下修改Makefile了。在里边添加一项:
捕获.JPG (17.98 KB, 下载次数: 36)
2016-11-16 18:16 上传
[img]C:\Users\BruceLee\AppData\Local\YNote\data\2377933161@qq.com\73108012bc37448bab076e8c9df52fd2\捕获.jpg[/img]
记下来写驱动代码。
一个字符型设备的要素有哪些?
1、一些声明的东西,比如MODULE_DESCRIPTION("Led Driver");和MODULE_LICENSE("GPL v2");
2、module_init(led_init);和module_exit(led_exit);
3、struct platform_device led_device 和 static struct platform_driver led_driver 并且把上面两个结构体注册的函数 platform_device_register(&led_device)) 和 platform_driver_register(&led_driver));
4、probe函数实现;
5、混杂设备结构体和注册函数,static struct miscdevice leds_dev 和 err = misc_register(&leds_dev);
6、文件操作函数实现static struct file_operations leds_ops;
后面的内容后续补上