一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Linux|Centos|Ubuntu|系統(tǒng)進程|Fedora|注冊表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服務器之家 - 服務器系統(tǒng) - Linux - Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

2023-12-13 18:22未知服務器之家 Linux

前言 ??驅動的開發(fā)需要先熟悉基本概念類型,本篇講解linux雜項設備基礎,還是基于虛擬機ubuntu去制作驅動,只需要虛擬機就可以嘗試編寫注冊雜項設備的基本流程。 linux三大設備驅動 字符設備 :IO的傳輸過程是以字符為單位的

前言

??驅動的開發(fā)需要先熟悉基本概念類型,本篇講解linux雜項設備基礎,還是基于虛擬機ubuntu去制作驅動,只需要虛擬機就可以嘗試編寫注冊雜項設備的基本流程。

linux三大設備驅動

  • 字符設備:IO的傳輸過程是以字符為單位的,沒有緩沖,比如I2C(SDA、SCL),SPI(MISO、MOSI、SCLK、CS)。
  • 塊設備:IO的傳輸過程是以塊為單位的,跟存儲相關的都屬于塊設備,比如tf卡,sd卡。
  • 網(wǎng)絡設備:IO的傳輸以socket套接字來訪問的。

雜項設備

  • 雜項設備是屬于 字符設備,可以自動生成設備節(jié)點,設備節(jié)點位于/dev/目錄下,是設備名稱,如/dev/ttyS9等。
  • 主設備號相同,統(tǒng)一為10,次設備號不同,主設備相同可以節(jié)省內(nèi)核資源。
    通過下列指令,可以查看系統(tǒng)雜項設備
cat/proc/misc

??在虛擬機上測試,查看雜項:
?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

  • 設備號分為主設備號和次設備號,主設備號是wei的,次設備號不一定wei
    通過下列指令,可以查看系統(tǒng)主設備號:
cat/proc/devices

?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

雜項設備描述結構體

??ubuntu來說,自帶的/usr/src下的就是內(nèi)核的頭文件。

cd/usr/src/linux-headers-4.18.0-15viinclude/linux/miscdevice.h

??定位到之前ubuntu自帶的內(nèi)核頭文件下:
?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo
?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

??查看到雜項設備的結構體:

structmiscdevice{
intminor;//次設備號
constchar*name;//設備節(jié)點名稱(如/dev/ttyS8,則ttyS是名稱)
conststructfile_operations*fops;//文件操作集(非常重要)
structlist_headlist;
structdevice*parent;
structdevice*this_device;
conststructattribute_group**groups;
constchar*nodename;
umode_tmode;};

??(注意:沒打注釋的,一般不管)

雜項設備文件操作集

cd/usr/src/linux-headers-4.18.0-15viinclude/linux/fs.h

??搜索到(vi則直接使用“/”):
?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

structfile_operations{
structmodule*owner;
loff_t(*llseek)(structfile*,loff_t,int);
ssize_t(*read)(structfile*,char__user*,size_t,loff_t*);
ssize_t(*write)(structfile*,constchar__user*,size_t,loff_t*);
ssize_t(*read_iter)(structkiocb*,structiov_iter*);
ssize_t(*write_iter)(structkiocb*,structiov_iter*);
int(*iterate)(structfile*,structdir_context*);
int(*iterate_shared)(structfile*,structdir_context*);
__poll_t(*poll)(structfile*,structpoll_table_struct*);
long(*unlocked_ioctl)(structfile*,unsignedint,unsignedlong);
long(*compat_ioctl)(structfile*,unsignedint,unsignedlong);
int(*mmap)(structfile*,structvm_area_struct*);
unsignedlongmmap_supported_flags;
int(*open)(structinode*,structfile*);
int(*flush)(structfile*,fl_owner_tid);
int(*release)(structinode*,structfile*);
int(*fsync)(structfile*,loff_t,loff_t,intdatasync);
int(*fasync)(int,structfile*,int);
int(*lock)(structfile*,int,structfile_lock*);
ssize_t(*sendpage)(structfile*,structpage*,int,size_t,loff_t*,int);
unsignedlong(*get_unmapped_area)(structfile*,unsignedlong,unsignedlong,unsignedlong,unsignedlong);
int(*check_flags)(int);
int(*setfl)(structfile*,unsignedlong);
int(*flock)(structfile*,int,structfile_lock*);
ssize_t(*splice_write)(structpipe_inode_info*,structfile*,loff_t*,size_t,unsignedint);
ssize_t(*splice_read)(structfile*,loff_t*,structpipe_inode_info*,size_t,unsignedint);
int(*setlease)(structfile*,long,structfile_lock**,void**);
long(*fallocate)(structfile*file,intmode,loff_toffset,
loff_tlen);
void(*show_fdinfo)(structseq_file*m,structfile*f);#ifndefCONFIG_MMU
unsigned(*mmap_capabilities)(structfile*);#endif
ssize_t(*copy_file_range)(structfile*,loff_t,structfile*,
loff_t,size_t,unsignedint);
int(*clone_file_range)(structfile*,loff_t,structfile*,loff_t,
u64);
ssize_t(*dedupe_file_range)(structfile*,u64,u64,structfile*,
u64);}__randomize_layout;

??例如read函數(shù),那么就是打開驅動使用系統(tǒng)read,打開這個設備驅動的句柄,那么久會調(diào)用read函數(shù),其他的以此類推,還比較好理解。
??以我們一個registerHelloWorld為例子,來簡單說明。

驅動編寫空模板準備

??首先復制之前的hello world的驅動,改個名字為:registerMiscDev:

cd~/work/drivecp-arfhellowolrdregisterMiscDev

?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

cdregisterMiscDev/rm*.ko*.o*.order*.symvers

??這里刪除起來麻煩,修改makefile,添加clean:
?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

??然后測試一下:
?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

??繼續(xù)修改源碼文件名稱:

mvhelloworld.cregisterMiscDev.c

??修改完如下:
?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

??然后修改makefile里面的(obj-m模塊名稱改下),模板準備好了
?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

??下面基于registerMiscDev.c文件進行注冊雜項設備,在修改.c文件:
?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

#include<linux/init.h>#include<linux/module.h>staticintregisterMiscDev_init(void){
//在內(nèi)核里面無法使用基礎c庫printf,需要使用內(nèi)核庫printk
printk("Hello,I’mhongPangZi,registerMiscDev_init\n");	
return0;}staticvoidregisterMiscDev_exit(void){
printk("bye-bye!!!\n");}MODULE_LICENSE("GPL");module_init(registerMiscDev_init);module_exit(registerMiscDev_exit);

雜項設備注冊流程Demo

步驟一:填充miscdevice結構體

??在編寫驅動的時候,代碼中填充信息結構體。
??添加頭文件miscdevice.h

#include<linux/miscdevice.h>#include<linux/fs.h>

?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

??然后填充雜項設備結構體:
?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

??(注意:開始為“.”,結束為“,”,最后一行習慣加“,”了,這樣可以全部統(tǒng)一復制啥的,省的加沒加的)

structmiscdevicemisc_dev{
.minor=MISC_DYNAMIC_MINRO,//這個宏是動態(tài)分配次設備號,避免沖突
.name="register_hongPangZi_misc,//設備節(jié)點名稱
.fops=misc_fops,//這個變量記住,自己起的,步驟二使用}

?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

步驟二:填充file_operations結構體

??在編寫驅動的時候,代碼中填充文件操作結構體。
?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

structfile_operationsmisc_fops{
.owner=THIS_MODULE}

?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

步驟三:注冊雜項設備并生成設備節(jié)點

??注冊到內(nèi)核:

staticintregisterMiscDev_init(void){
//在內(nèi)核里面無法使用基礎c庫printf,需要使用內(nèi)核庫printk
printk("Hello,I’mhongPangZi,registerMiscDev_init\n");	
intret=0;
ret=misc_register(misc_dev);
if(ret<0)
{
printk("Failedtomisc_register(misc_dev)\n");	
return-1;
}
return0;}

?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

??有注冊就有注銷:

staticintregisterMiscDev_init(void){
//在內(nèi)核里面無法使用基礎c庫printf,需要使用內(nèi)核庫printk
printk("Hello,I’mhongPangZi,registerMiscDev_init\n");	
intret=0;
ret=misc_register(&misc_dev);
if(ret<0)
{
printk("Failedtomisc_register(misc_dev)\n");	
return-1;
}
return0;}

?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

??完整的文件源碼:

#include<linux/init.h>#include<linux/module.h>#include<linux/miscdevice.h>#include<linux/fs.h>structfile_operationsmisc_fops={
.owner=THIS_MODULE,};structmiscdevicemisc_dev={
.minor=MISC_DYNAMIC_MINOR,//這個宏是動態(tài)分配次設備號,避免沖突
.name="register_hongPangZi_misc",//設備節(jié)點名稱
.fops=&misc_fops,//這個變量記住,自己起的,步驟二使用};staticintregisterMiscDev_init(void){
//在內(nèi)核里面無法使用基礎c庫printf,需要使用內(nèi)核庫printk
printk("Hello,I’mhongPangZi,registerMiscDev_init\n");	
intret=0;
ret=misc_register(&misc_dev);
if(ret<0)
{
printk("Failedtomisc_register(&misc_dev)\n");	
return-1;
}
return0;}staticvoidregisterMiscDev_exit(void){
misc_deregister(&misc_dev);
printk("bye-bye!!!\n");}MODULE_LICENSE("GPL");module_init(registerMiscDev_init);module_exit(registerMiscDev_exit);

步驟四:編譯make

make

??直接在驅動工程目錄編譯:
?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

??下面這個警告,實際上定義要在任何使用函數(shù)之前:
?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

??修改下:
?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

??編譯成功
?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

步驟五:加載卸載驅動測試

??將驅動拷貝到開發(fā)板或者目標系統(tǒng),然后使用加載指令:

sudoinsmodregisterMiscDev.ko

??會打印入口加載的printk輸出。
?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

??出現(xiàn)問題可能原因一是內(nèi)核編譯使用的編譯器和模塊使用的編譯器版本不一致。ubuntu中printk終端打入內(nèi)核日志消息了,可以使用dmesg進行查看:

dmesg

?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

??然后查看是否加入了雜項設備節(jié)點:
?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

??然后注銷:

sudormmodregisterMiscDev.ko

?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

??跟隨著,結點消失了:
?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

入坑

入坑一:編譯報錯,結構體之后未加分號

問題

??編譯錯誤,結構體后面加分號

解決

??加分號,腦袋有點蒙
?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

入坑二:編譯錯誤,文件操作指針問題

問題

?? Linux驅動開發(fā)筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發(fā)雜項設備Demo

解決

??這是寫錯了,是指針,需要加取地址&。


延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: www.av在线视频 | 白丝打脚枪 | 亚洲欧美日韩综合在线播放 | 欧美xbxbxbxb大片 | 9自拍视频在线观看 | 猫扑俩性 | 成人网免费视频 | 无耻之徒第十一季在线观看 | 久久99视热频国只有精品 | www.大逼色 | 亚洲啊v| 亚洲视频日韩 | 全肉一女n男np高h双龙养成 | 欧美精品1区2区 | 白丝爆动漫羞羞动漫软件 | 双性肉文h | 丝瓜视频在线观看污 | 欧美精品成人a多人在线观看 | 久久香蕉国产免费天天 | 日韩日日操 | 欧美巨胸| 免费大片a一级一级 | 疯狂激吻添下边小说 | 精品无人乱码一区二区三区 | 91国产在线第7页 | 天天插伊人 | 四虎最新免费观看网址 | 无码国产成人午夜在线观看不卡 | ai换脸造梦jennie | 男人猛进猛出女人下面视频 | 欧美疯狂做爰3xxx | 成 人 亚洲 综合天堂 | 好深快点再快点好爽视频 | 欧美se图 | 欧美色成人tv在线播放 | 亚洲黄色高清 | www.精品在线 | 爱情岛论坛亚洲品质自拍视频 | 2022最新国产在线 | 亚洲国产午夜看片 | 色悠久久久久综合网小说 |