gm8142作为混杂设备添加驱动,由于原本AD7193驱动使用的是gpio模拟的SPI接口,所以gm8142直接在这个基础是移植驱动,也用模拟的SPI接口。
步骤如下:
1、定义驱动结构体
static struct spi_driver gm8142_driver = {
.driver = {
.name = DRV_NAME,
.owner = THIS_MODULE,
},
.probe = gm8142_probe,
.remove = gm8142_remove,
};
其中,gm8142_probe为探测接口,调用时发生在设备和驱动对应上要为秦晋之好时,此接口需要自己实现,主要完成gpio口的初始化,并且读取芯片的ID来验证通信是否正常和其他的一些初始化工作。gm8142_remove接口也要自己实现,完成资源的释放等工作。
2、定义设备结构体
static const struct file_operations gm8142_fops =static const struct file_operations gm8142_fops结构体包含了这个设备操作的一系列函数,都要自己实现。这个结构体最终是赋值给static struct miscdevice gm8142_miscdev 这个混杂设备的结构体的。
3、将以上的结构体启用,编写一个初始化接口
static int __init gm8142_init(void)
{
int ret;
ret = spi_register_driver(&gm8142_driver);
if (ret) {
printk("spi_register_driver gm8142 driver error\n");
return ret;
}
ret = misc_register(&gm8142_miscdev);
if (ret) {
printk("misc_unregister error\n");
return ret;
}
}
该函数依次注册驱动(使用刚才定义的驱动结构体变量gm8142_driver),然后注册设备(使用刚才定义的设备结构体变量gm8142_miscdev),在这个过程之后,设备和驱动都联系上了,因为他们会自动寻找对方。
4、编写设备和驱动删除函数
static void __exit gm8142_exit(void)
{
int ret;
printk(KERN_INFO " gm8142 step out...[remove me!]\n");
ret = misc_deregister(&gm8142_miscdev);
if (ret) {
printk("misc_register error\n");
return ret;
}
spi_unregister_driver(&gm8142_driver);
}
5、最后将3、4两步的初始化函数初始化、删除函数导入到调用入口如下:
module_init(gm8142_init);
module_exit(gm8142_exit);
6、调用一些宏添加信息
MODULE_DESCRIPTION(DRV_DESC);
MODULE_VERSION(DRV_VERSION);
MODULE_AUTHOR("Merlin <[email protected]>");
MODULE_LICENSE("GPL v2");
宏的说明:
module_init和module_exit行使用了内核的特殊宏来表示上述两个函数所扮演的角色。另外一个特殊宏 (MODULE_LICENSE)用来表示内核,该模块采用自由许可证;如果没有这样的声明,内核在装载该模块时会产生抱怨,还有如下一些常用的宏
7、openwrt1407/target/linux/ar71xx/files/arch/mips/ath79目录下添加dev-spi-gpio.c、dev-spi-gpio.h和mach-dragino2.c三个文件,在dev-spi-gpio更改你的模拟SPI接口驱动程序用到的那几个GPIO口。
8、编译驱动模块。如果内核不更新, 可以只制定这个驱动包编译,如:make package/utils/gm8142/compile V=s,那么就可只编译这个包,可能会同时生成ipk文件和ko文件,驱动加载要用KO文件。用到:
insmod xxxxx.kormmod xxxxx
ko 是内核模块文件,是内核加载的某个模块,一般是驱动程序,
.so 文件是动态链接库文件,相当于 win下的 .dll 文件
.ipk文件是和rpm十分类似个包格式,是文件空间更小
在openwrt下.ko文件一般在/build_dir下,ipk文件一般在/bin目录下,可以搜索来具体定位。
9、安装完成之后打卡/dev查看,gm8142设备的名称。