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)用来表示内核,该模块采用自由许可证;如果没有这样的声明,内核在装载该模块时会产生抱怨,还有如下一些常用的宏

                          特殊宏                        说明                    MODULE_AUTHOR(author)描述模块作者MODULE_DESCRIPTION(description)说明模块用途的简短描述MODULE_VERSION(version_string)代码修订号MODULE_DEVICE_TABLE(table_info)告诉用户空间模块所支持的设备MODULE_ALIAS(alternate_name)模块的别名

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设备的名称。 

0 0
原创粉丝点击