這裡總結下簡單的匯流排裝置驅動的框架程式。
0、建立資料夾busdevdrv
1、匯流排
在資料夾內建立匯流排檔案bus.c,**如下。
#include
#include
#include
#include
#include
module_author("sjwangjinbao");
module_license("dual bsd/gpl");
static char *version = "$revision: 1.0 $";
static int my_match(struct device *dev, struct device_driver *driver)
static void my_bus_release(struct device *dev)
struct device my_bus = ;
struct bus_type my_bus_type = ;
export_symbol(my_bus);
export_symbol(my_bus_type);
/** export a ****** attribute.
*/static ssize_t show_bus_version(struct bus_type *bus, char *buf)
static bus_attr(version, s_irugo, show_bus_version, null);
static int __init my_bus_init(void)
/*建立屬性檔案*/
if (bus_create_file(&my_bus_type, &bus_attr_version))
/*初始化匯流排裝置*/
dev_set_name(&my_bus, "my_bus0");
/*註冊匯流排裝置*/
ret = device_register(&my_bus);
if (ret)
return ret;
}static void my_bus_exit(void)
module_init(my_bus_init);
module_exit(my_bus_exit);
2、裝置
在資料夾下建立裝置檔案dev.c,**如下。
#include
#include
#include
#include
#include
module_author("sjwangjinbao");
module_license("dual bsd/gpl");
extern struct device my_bus;
extern struct bus_type my_bus_type;
static void my_dev_release(struct device *dev)
struct device my_dev = ;
/** export a ****** attribute.
*/static ssize_t mydev_show(struct device *dev,struct device_attribute *attr, char *buf)
static device_attr(dev, s_irugo, mydev_show, null);
static int __init my_device_init(void)
static void my_device_exit(void)
module_init(my_device_init);
module_exit(my_device_exit);
3、驅動
在資料夾下建立驅動檔案drv.c,**如下。
#include
#include
#include
#include
#include
module_author("sjwangjinbao");
module_license("dual bsd/gpl");
extern struct bus_type my_bus_type;
static int my_probe(struct device *dev)
static int my_remove(struct device *dev)
struct device_driver my_driver = ;
/** export a ****** attribute.
*/static ssize_t mydriver_show(struct device_driver *driver, char *buf)
static driver_attr(drv, s_irugo, mydriver_show, null);
static int __init my_driver_init(void)
static void my_driver_exit(void)
module_init(my_driver_init);
module_exit(my_driver_exit);
4、makefile
在資料夾下建立makefile,如下。
ifneq ($(kernelrelease),)
obj-m := bus.o dev.o drv.o
else
kdir := /usr/src/linux-2.6.33.2
all:
make -c $(kdir) m=$(pwd) modules
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif
5、make
在資料夾下執行make命令,將得到bus.ko, dev.ko, drv.ko三個檔案。
6、新增模組
使用root使用者依次呼叫如下命令新增3個模組:
insmod bus.ko
insmod dev.ko
insmod.drv.ko
這時候,會在/sys/bus下面發現my_bus已經存在了。到/sys/bus/my_bus/devices/看看,發現我們的my_dev裝置已經存在了;到/sys/bus/my_bus/drivers/看看,發現我們的my_dev驅動也存在了。在到/sys/bus/my_bus/devices/my_dev/driver去瞧瞧,發現my_dev驅動已經存在了,這說明我們的 my_dev裝置和my_dev驅動已經聯絡在一起了。同樣,在/sys/bus/my_bus/drivers/my_dev下也會發現有個my_dev的裝置,這也說明我們的 my_dev裝置和my_dev驅動已經聯絡在一起了。
另外,我們也可以檢視他們的屬性。
1) 在/sys/bus/my_bus下,我們發現有個version檔案,用cat檢視它,得到輸出為:
$revision: 1.9 $
這正是我們在程式中指定的。
2) 在/sys/bus/my_bus/devices/my_dev下,我們會發現有個 dev檔案,用cat檢視它,結果為:
this is my device!
這也正是我們程式中指定的。
3) 在/sys/bus/my_bus/drivers/my_dev下,我們也會發現drv檔案,用cat檢視結果為:
this is my driver!
當然,這也是我們在程式中指定的。
驅動 匯流排裝置框架
匯流排裝置驅動框架是一種類似於輸入子系統的框架。匯流排裝置驅動,顧名思義,共有三個模組 負責硬體資源的裝置 device 負責處理硬體事務並且連線其他功能模組的驅動 driver 連線這兩者的匯流排 bus 其過程分為以下步驟 1.當加入乙個裝置時,如果該裝置支援中斷喚醒執行緒,那麼在中斷處理程式內...
Linux匯流排裝置驅動框架的理解
linux的裝置驅動框架,即某類裝置對應的驅動的框架。這裡是 linux匯流排裝置驅動框架 應該這樣理解,linux的匯流排裝置 驅動框架,即匯流排式裝置對應的驅動的框架 個人理解 1 驅動代表著操作裝置的方式和流程。對於應用來說,應用程式open開啟裝置後,接著就read訪問這個裝置,驅動就是如何...
匯流排 裝置和驅動
一 匯流排 linux中,使用struct bus type表示一條匯流排,該結構定義在linux device.h中,先只看其中的兩個字段,name表示匯流排的名字,比如usb i2c spi等,match方法用於匹配新增到該匯流排上的裝置和驅動,如果匹配成功,則呼叫驅動中的probe函式。註冊一...