Linux driver程式設計

2021-06-14 14:42:33 字數 4362 閱讀 6102

#include 

#include 

#include 

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("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); //註冊驅動的屬性

寫Linux driver 血的教訓

linux作業系統下編寫driver並不是一件非常困難的時情。但是粗心 戀戰,絕對是寫driver時候製造痛苦的絕代雙驕。2005年的十一長假,我計畫完成兩件事 1.在i386 linux的系統上完成自製紅外收發板的接收驅動部分 該平台下的傳送驅動已經完成 2.把軟體移植到s3c2410 arm l...

程式設計,還是程式設計

喜歡程式設計,雖然水平一般,但還是執著地學習與程式設計有關的知識。中間因為工作關係與程式設計遠離了一段時間,現在又重拾起來,細想起來還是因為喜歡吧。喜歡程式軟體的思想和原理,喜歡程式 的魅力和成就感。程式設計軟體的思想是最值得學習的,一直認為思想決定行動,思想改變世界。每種軟體的流行和受人追捧,無不...

少兒程式設計程式設計

機械人比賽,聽上去讓人有一種高大上的科技感,沒錯,在大多數人眼裡,玩機械人那是科學家做的事情,不過隨著機械人教育的普及,越來越多的孩子也能夠駕馭這高大上的機械人。格物斯坦小坦克告訴你原因,這是歸結於孩子對於程式設計課程的學習,學會對機械人進行程式設計了,自然就能玩轉機械人啦。參加機械人比賽的意義遠遠...