gm8142在/dev目录中显示
来源:互联网 发布:xmanager5 mac 编辑:程序博客网 时间:2024/04/29 17:34
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 ={
.owner = THIS_MODULE,
.open = op_gm8142_open,
.unlocked_ioctl = op_gm8142_unlocked_ioctl,
.read = op_gm8142_read,
.release = op_gm8142_release,
};
和
static struct miscdevice gm8142_miscdev =
{
.minor = MISC_DYNAMIC_MINOR,
.name = GM8142_NODE_NAME,
.fops = &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 <tfa2012@foxmail.com>");
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设备的名称。
- gm8142在/dev目录中显示
- c# pdf在目录中显示页码
- Linux中目录proc/net/dev详解
- /dev目录
- /dev: 目录
- dev目录
- AndroidStudio中project的model在Android目录中显示
- latex 生成目录,在目录中显示“参考文献”,设置标题居左显示
- Solaris 在当前用户提示符中显示当前目录
- 拍照插入指定目录,并显示在系统相册中
- 在Eclipse中显示.project和.classpath和.setting目录
- 在Eclipse中显示.project和.classpath和.setting目录
- 在Eclipse中显示.project和.classpath和.setting目录
- 在Eclipse中显示.project和.classpath和.setting目录
- 在Eclipse中显示.project和.classpath和.setting目录
- 在Eclipse中显示.project和.classpath和.setting目录
- 在Eclipse中显示.project和.classpath和.setting目录
- 在Eclipse中显示.project和.classpath和.setting目录
- 如何理解c和c ++的复杂类型声明
- 评价一个人,就是要看他把时间都花在哪了
- [UVA10870] Recurrences
- 番茄育种之编号 待续
- 解决ArcGIS10x安装在windows8.0+环境无法正常安装 .NET Framework 3.5
- gm8142在/dev目录中显示
- MFC视图切换大全总结
- ch6.JSP内置对象--request对象
- 不知道怎么拟标题
- Matlab画柱形图及正态分布图
- 低秩矩阵的应用--背景建模
- Java学习day10
- 配置Groovy开发运行环境
- android之listView之增删改查