[置頂] Linux driver編程

來源:互聯網
上載者:User

#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,

    .release = usb_dev_release,

};

 

struct device_driver my_device_driver = {

    .name = "my_usb_driver", //驅動的名字

    .bus = &my_usb_bus, //註冊驅動時,指定該驅動掛載到my_usb_bus匯流排下面

};

 

#define COUNT_SIZE  100

 

char data[COUNT_SIZE] = "Hello MikeChen";

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

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

 

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);

}

 

static ssize_t show_driver_version(struct device_driver *drv, char *buf)

 

{

 

    return snprintf(buf, COUNT_SIZE, "%s\n", data_device_driver);

 

}

 

static ssize_t store_driver_version(struct device_driver *drv,

 

const char *buf, size_t count)

 

{

 

    return snprintf(data_device_driver, COUNT_SIZE, "%s", 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 DRIVER_ATTR(version_device_driver, S_IRUGO|S_IWUGO, show_driver_version, store_driver_version); 

 

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");

 

     ret = driver_register(&my_device_driver); //註冊驅動

    if(ret)

    {

        printk("driver register failed!\n"); 

        return 0

    }

     ret = driver_create_file(&my_device_driver, &driver_attr_device_driver); //註冊驅動的屬性

 

 

    if(ret)

    {

        printk("driver creat file failed!\n");

    } 

    return 0;

}

 

static void __exit my_usb_bus_exit(void)

{   

    driver_remove_file(&my_device_driver, &driver_attr_version);

    driver_unregister(&my_device_driver); 

    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);

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.