一、程序分析
1. 包含總線
既然我們的設(shè)備在總線上,自然我們既要包含總線了
如圖所示,使用外部聲明將我們的總線的結(jié)構(gòu)體包含進(jìn)來(lái)
2. 定義設(shè)備結(jié)構(gòu)體
父目錄為 my_bus
3. 定義屬性文件結(jié)構(gòu)體
屬性文件結(jié)構(gòu)體可以有一下得到:
//產(chǎn)生后面的 bus_attr_version 結(jié)構(gòu)體
static DEVICE_ATTR(dev,S_IRUGO,mydev_show,NULL);
如圖所示:
4. 在初始化函數(shù)中
如圖所示:
在初始化函數(shù)中,
先初始化設(shè)備的名字,這個(gè)名字用于于驅(qū)動(dòng)名字進(jìn)行匹配
然后注冊(cè)設(shè)備,讓系統(tǒng)認(rèn)識(shí)這個(gè)設(shè)備,在/sys/device/my_bus0 下面就會(huì)有my_dev這個(gè)設(shè)備
最后創(chuàng)建屬性文件,這個(gè)就是在my_dev下面的 dev文件,可以使用cat dev 進(jìn)行讀取,用于傳遞字符串。
5. 在exit函數(shù)中
如圖所示就是 移除屬性文件,注銷(xiāo)設(shè)備
二、編譯測(cè)試
可以發(fā)現(xiàn),在我們的/sys/bus/目錄下生成了 my_bus 目錄
然后,在 my_bus/devices/ 目錄下又生成了 my_dev 目錄
查看my_dev的屬性文件 cat dev
我們使用cat drivers_autoprobe 命令,為1,意思就是我們驅(qū)動(dòng)會(huì)自動(dòng)探測(cè)設(shè)備
移除驅(qū)動(dòng)時(shí)最好注意順序
至此,總線-設(shè)備-驅(qū)動(dòng) 模型中,我們已經(jīng)完成其二了,最后的一個(gè)驅(qū)動(dòng)篇,加油!
我們的目標(biāo)是在總線中加入驅(qū)動(dòng)程序,并且驅(qū)動(dòng)程序和設(shè)備程序會(huì)自動(dòng)互相探測(cè)尋找,然后在match中檢測(cè)關(guān)聯(lián)。
附上 mybus .c 總線驅(qū)動(dòng)程序
1 #include
2 #include
3 #include
4 #include
5 #include
6
7
8 static char *Version = '$LoverXueEr : 1.0 $';
9
10 //檢測(cè)驅(qū)動(dòng)是否匹配設(shè)備,dev->bus_id 和 driver->name相等的
11 static int my_match(struct device *dev ,struct device_driver *driver){
12 return !strncmp(dev_name(dev),driver->name,strlen(driver->name));
13 }
14
15 static void my_bus_release(struct device *dev){
16 printk('
17 }
18
19 //設(shè)置設(shè)備的名字 dev_set_name(&dev,'name');
20 struct device my_bus = {
21 .init_name = 'my_bus0',
22 .release = my_bus_release,
23 };
24
25 struct bus_type my_bus_type = {
26 .name = 'my_bus',
27 .match = my_match,
28 };
29 EXPORT_SYMBOL(my_bus); //導(dǎo)出符號(hào)
30 EXPORT_SYMBOL(my_bus_type);
31
32 //顯示總線版本號(hào)
33 static ssize_t show_bus_version(struct bus_type *bus,char *buf){
34 return snprintf(buf,PAGE_SIZE,'%sn',Version);
35 }
36
37 //產(chǎn)生后面的 bus_attr_version 結(jié)構(gòu)體
38 static BUS_ATTR(version,S_IRUGO, show_bus_version, NULL);
39
40 static int __init my_bus_init(void){
41 int ret;
42 /* 注冊(cè)總線 */
43 ret = bus_register(&my_bus_type);
44 if(ret)
45 return ret;
46 /* 創(chuàng)建屬性文件 */
47 if(bus_create_file(&my_bus_type, &bus_attr_version))
48 printk('
49
50 /* 注冊(cè)總線設(shè)備 */
51 ret = device_register(&my_bus);
52 if(ret)
53 printk('
54 return ret;
55 }
56
57 static void my_bus_exit(void){
58 bus_unregister(&my_bus_type);
59 device_unregister(&my_bus);
60 }
61
62 module_init(my_bus_init);
63 module_exit(my_bus_exit);
64
65
66 MODULE_AUTHOR('Lover雪兒');
67 MODULE_LICENSE('GPL');
附上 mydev .c 設(shè)備驅(qū)動(dòng)程序
1 #include
2 #include
3 #include
4 #include
5 #include
6
7 //包含總線
8 extern struct device my_bus;
9 extern struct bus_type my_bus_type;
10
11 static void my_dev_release(struct device *dev){
12 printk('
13 }
14
15 //設(shè)置設(shè)備的名字 dev_set_name(&dev,'name');
16 struct device my_dev = {
17 .bus = &my_bus_type,
18 .parent = &my_bus, //父目錄為my_bus
19 .release = my_dev_release,
20 };
21
22 ssize_t mydev_show(struct device *dev,struct device_attribute *attr,char *buf){
23 return sprintf(buf, '%sn', 'This is my device');
24 }
25
26 //產(chǎn)生后面的 dev_attr_dev 結(jié)構(gòu)體
27 static DEVICE_ATTR(dev,S_IRUGO,mydev_show,NULL);
28
29 static int __init my_dev_init(void){
30 int ret = 0;
31
32 /* 初始化設(shè)備 以后看驅(qū)動(dòng)與設(shè)備是否匹配就看這個(gè)名字 */
33 dev_set_name(&my_dev,'my_dev');
34
35 /* 注冊(cè)設(shè)備 */
36 ret = device_register(&my_dev);
37 if(ret)
38 printk('
39 /* 創(chuàng)建屬性文件 */
40 if(device_create_file(&my_dev, &dev_attr_dev))
41 printk('
42
43 return ret;
44 }
45
46 static void my_dev_exit(void){
47 device_remove_file(&my_dev, &dev_attr_dev);
48 device_unregister(&my_dev);
49 }
50
51 module_init(my_dev_init);
52 module_exit(my_dev_exit);
53
54
55 MODULE_AUTHOR('Lover雪兒');
56 MODULE_LICENSE('GPL');
附上 MAKEFILE程序
1 ifeq ($(KERNELRELEASE),)
2 KERNELDIR ?= /home/study/system/linux-2.6.31
3 PWD := $(shell pwd)
4 modules:
5 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
6 modules_install:
7 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
8 clean:
9 rm -rf *.o *~ core .depend *.cmd *.ko *.mod.c .tmp_versions *.markers *.order *.symvers
10
11 else
12 obj-m := mybus.o mydev.o
13 endif
上一篇:IMX257 總線設(shè)備驅(qū)動(dòng)模型編程之驅(qū)動(dòng)篇
下一篇:IMX257 總線設(shè)備驅(qū)動(dòng)模型編程之總線篇(二)
推薦閱讀最新更新時(shí)間:2025-06-07 23:40
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無(wú)線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開(kāi)發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹(shù)莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁(yè)和arduino的通訊
- ESP32 freeRTOS使用測(cè)試
- API調(diào)用小記(Touchdesigner和ESP32)
- 關(guān)于ESP32/8266使用async-mqtt-client庫(kù)的一些基本介紹
- LTM4602HV 演示板、28V、6A 降壓模塊穩(wěn)壓器
- PCB書(shū)簽 尺子 卡片
- PeanutPI
- 平衡自行車(chē)+獨(dú)輪車(chē)
- AM1DR-1209SZ 9V 1 瓦 DC-DC 轉(zhuǎn)換器的典型應(yīng)用
- NCV33074ADR2G 直流耦合反相放大器最大輸出擺幅的典型應(yīng)用
- 【明日方舟】羅德島本艦主控板V6.2
- DC795A,使用 LT5527EUF 4.5V 至 5.25V 高線性下變頻混頻器的演示板
- XL4016可調(diào)恒壓恒流實(shí)驗(yàn)電源
- 帶內(nèi)部開(kāi)關(guān)的 PAM2863 2A LED 驅(qū)動(dòng)器的典型應(yīng)用
- 防腐音叉開(kāi)關(guān)的種類(lèi)及其應(yīng)用
- Dialog為嘉年華郵輪集團(tuán)可穿戴設(shè)備提供WiRa?的芯片解決方案
- Arm的下一個(gè)戰(zhàn)場(chǎng)揭秘
- 磁翻板液位計(jì)密封結(jié)構(gòu)的弊端及改進(jìn)
- Counterpoint:印度智能手機(jī)市場(chǎng)或創(chuàng)新高
- 壁仞科技啟動(dòng)新產(chǎn)品線,國(guó)產(chǎn)圖形GPU賽道迎來(lái)“種子選手”
- 是德科技處于自動(dòng)駕駛安全標(biāo)準(zhǔn)和認(rèn)證的前沿
- Excelitas公司推出μPAX-3脈沖氙氣光源
- 芯原超低能耗NPU可為移動(dòng)端大語(yǔ)言模型推理提供超40 TOPS算力
- 芯原AI-ISP芯片定制方案助力客戶智能手機(jī)量產(chǎn)出貨
- AI加持,安森美一站式服務(wù)推動(dòng)助聽(tīng)器市場(chǎng)持續(xù)進(jìn)步
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無(wú)線微控制器STM32WL33的集成的匹配濾波芯片
- 如何為您的應(yīng)用選擇光傳感器
- Samtec新型農(nóng)業(yè)漫談系列二 | 垂直農(nóng)業(yè)案列分享
- Samtec應(yīng)用科普 | C-V2X技術(shù)在汽車(chē)領(lǐng)域的應(yīng)用
- 尼得科運(yùn)動(dòng)&能源事業(yè)本部在印度卡納塔克邦胡布利舉行新工廠竣工儀式
- 貿(mào)澤開(kāi)售Qorvo適用于5G和mMIMO應(yīng)用的新型QPA9822線性5G高增益/高驅(qū)動(dòng)放大器
- 邊緣計(jì)算網(wǎng)關(guān)工業(yè)物聯(lián)網(wǎng)應(yīng)用:空壓機(jī)遠(yuǎn)程運(yùn)維監(jiān)控管理
- 智能汽車(chē)何時(shí)才能實(shí)現(xiàn)“軟硬兼收”?
- 商用服務(wù)機(jī)器人優(yōu)地科技再獲數(shù)億元融資
- LightWare新推全球最小最輕激光雷達(dá),可應(yīng)用于自動(dòng)駕駛汽車(chē)
- R-Car Virtual Platform加速下一代車(chē)載系統(tǒng)軟件開(kāi)發(fā)
- TI高效助力電動(dòng)汽車(chē)實(shí)現(xiàn)全面的動(dòng)力總成集成
- 集邦咨詢:博通二季度營(yíng)收壓過(guò)高通,位居十大IC設(shè)計(jì)公司
- 信維通信VS碩貝德:天線雙雄半年報(bào)角逐,誰(shuí)更勝一籌?
- 茂萊光學(xué)海外業(yè)務(wù)受多重沖擊,存貨跌價(jià)損失加大成了隱憂
- 推進(jìn)工廠完全自動(dòng)化,武藏精密推出質(zhì)量控制機(jī)器人
- 一文詳解機(jī)器人技術(shù)八大發(fā)展趨勢(shì)