博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设备编程[置顶] Linux 设备编程
阅读量:6947 次
发布时间:2019-06-27

本文共 3179 字,大约阅读时间需要 10 分钟。

改章节个人在上海吃饭的时候突然想到的...之前就有想写几篇关于设备编程的笔记,所以回家到之后就奋笔疾书的写出来发布了

    设备挂载到bus总线上

    #include <linux/module.h>

    #include <linux/init.h>

    #include <linux/device.h>

    void usb_dev_release(struct device *dev);

    struct bus_type my_usb_bus = {

    .name = "my_usb",   //总线的名字,注册胜利后会在/sys/bus/目录下看到

    };

    struct device my_usb_device = {

    .bus_id = "usb_device", //  设备的名字

    .bus = &my_usb_bus, //这个设备会在my_usb_bus总线上挂载

    .release = usb_dev_release,

    };

    #define COUNT_SIZE  100

    char data[COUNT_SIZE] = "Hello MikeChen";

    char data_device[COUNT_SIZE] = "Hello MikeChen this is my device";

    void usb_dev_release(struct device *dev)

    {

    printk("<kernel>release\n");

    }

    /*

    内核到用户空间的数据

    */

    static ssize_t show_device_data(struct device* bus, struct device_attribute *attr, char *buf)  

    {

    return snprintf(buf, COUNT_SIZE, "show Bus Data: %s\n", data_device);

    }

    /*

    用户空间到内核的数据

    */

    static ssize_t store_device_data(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)

    {

    return snprintf(data_device, COUNT_SIZE, "Store Bus Data: %s\n", buf);

    }

    /*

    内核到用户空间的数据

    */

    static ssize_t show_bus_data(struct bus_type * bus, char *buf)  

    {

    return snprintf(buf, COUNT_SIZE, "show Bus Data: %s\n", data);

    }

    /*

    用户空间到内核的数据

    */

    static ssize_t store_bus_data(struct bus_type * bus, const char *buf, size_t count)

    {

    return snprintf(data, COUNT_SIZE, "Store Bus Data: %s\n", buf);

    }

    /*

    注意该宏最终返回bus_attr_version

    #define BUS_ATTR(_name, _mode, _show, _store) \

    每日一道理
爱,有的时候不需要山盟海誓的承诺,但她一定需要细致入微的关怀与问候;爱,有的时候不需要梁祝化蝶的悲壮,但她一定需要心有灵犀的默契与投合;爱,有的时候不需要雄飞雌从的追随,但她一定需要相濡以沫的支持与理解。

    struct bus_attribute bus_attr_##_name = __ATTR(_name, _mode, _show, _store)

    */

    static BUS_ATTR(version, S_IRUGO | S_IWUGO, show_bus_data, store_bus_data);

    static DEVICE_ATTR(verison_device, S_IRUGO | S_IWUGO, show_device_data, store_device_data);

    static int __init my_usb_bus_init(void)

    {

    int ret;

    ret = bus_register(&my_usb_bus);

    if (ret)

    {

        printk("Bus register failed!, ret: %d\n", ret);

        return ret;

    }

    printk("Usb init commplete\n");

    ret = bus_create_file(&my_usb_bus, &bus_attr_version);

    if (ret)

    {

        printk("Bus Create file failed");

        bus_unregister(&my_usb_bus);

        return 0;

    }

    printk("Bus ATTR Create Commplete\n");

    ret = device_register(&my_usb_device);

    if (ret)

    {

        printk("Device Register failed\n");

        bus_remove_file(&my_usb_bus, &bus_attr_version)

        bus_unregister(&my_usb_bus);

        return 0;

    }

    printk("Device Register commplete\n");

    ret = device_create_file(&my_usb_device, &dev_attr_verison_device);

    if (ret)

    {   

        printk("Device Create failed\n");

        device_unregister(&my_usb_device);

        bus_remove_file(&my_usb_bus, &bus_attr_version)

        bus_unregister(&my_usb_bus);

        return 0;

    }

    printk("Device Create commplete\n");

    return 0;

    }

    static void __exit my_usb_bus_exit(void)

    {   

    device_create_file(&my_usb_bus, &dev_attr_verison_device);

    device_unregister(&my_usb_device);

    bus_remove_file(&my_usb_bus, &bus_attr_version)

    bus_unregister(&my_usb_bus);

    printk("Usb Bus exit\n");

    }

    MODULE_LICENSE("GPL");

    MODULE_AUTHOR("MIKE CHEN");

    module_init(my_usb_bus_init);

    module_exit(my_usb_bus_exit);

    设备和编程设备和编程

文章结束给大家分享下程序员的一些笑话语录: PC软件体积大,是因为一个PC软件功能往往较多,能够满足你一个方面的需求,而一个iphone软件往往没几行代码,干一件很小的事情,自然需要的软件就多。就像吃西瓜和吃瓜子的来比数目,单位不同啊。

--------------------------------- 原创文章 By

设备和编程
---------------------------------

你可能感兴趣的文章
DOM对象与jquery对象
查看>>
1.6(SQL学习笔记)存储过程
查看>>
XXS level8
查看>>
分布式日志收集系统:Facebook Scribe
查看>>
VxWorks下PCI驱动的配置与测试
查看>>
NSString 中包含中文字符时转换为NSURL
查看>>
Unity 协程停不了?
查看>>
多个文本框点击复制 zClip (ZeroClipboard)有关问题
查看>>
5款手机应用开发框架推荐
查看>>
Gawker攻击事件暴露密码保护缺陷
查看>>
16.ARC
查看>>
OpenCV——ANN神经网络
查看>>
.NET 证书加密 存储保存 IIS授权
查看>>
了解大数据的特点、来源与数据呈现方式
查看>>
spring 组件扫描配置说明component-scan
查看>>
Clarke and five-pointed star
查看>>
设计模式系列2-----C++实现责任链模式(Chain of Responsibility)
查看>>
20189312任方园《网络攻防》第六次作业
查看>>
929. Unique Email Addresses
查看>>
php
查看>>