#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...
程式設計,還是程式設計
喜歡程式設計,雖然水平一般,但還是執著地學習與程式設計有關的知識。中間因為工作關係與程式設計遠離了一段時間,現在又重拾起來,細想起來還是因為喜歡吧。喜歡程式軟體的思想和原理,喜歡程式 的魅力和成就感。程式設計軟體的思想是最值得學習的,一直認為思想決定行動,思想改變世界。每種軟體的流行和受人追捧,無不...
少兒程式設計程式設計
機械人比賽,聽上去讓人有一種高大上的科技感,沒錯,在大多數人眼裡,玩機械人那是科學家做的事情,不過隨著機械人教育的普及,越來越多的孩子也能夠駕馭這高大上的機械人。格物斯坦小坦克告訴你原因,這是歸結於孩子對於程式設計課程的學習,學會對機械人進行程式設計了,自然就能玩轉機械人啦。參加機械人比賽的意義遠遠...