激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

Linux|Centos|Ubuntu|系統進程|Fedora|注冊表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

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

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

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

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

前言

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

linux三大設備驅動

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

雜項設備

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

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

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

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

雜項設備描述結構體

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

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

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

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

structmiscdevice{
intminor;//次設備號
constchar*name;//設備節點名稱(如/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驅動開發筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發雜項設備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函數,那么就是打開驅動使用系統read,打開這個設備驅動的句柄,那么久會調用read函數,其他的以此類推,還比較好理解。
??以我們一個registerHelloWorld為例子,來簡單說明。

驅動編寫空模板準備

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

cd~/work/drivecp-arfhellowolrdregisterMiscDev

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

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

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

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

??繼續修改源碼文件名稱:

mvhelloworld.cregisterMiscDev.c

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

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

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

#include<linux/init.h>#include<linux/module.h>staticintregisterMiscDev_init(void){
//在內核里面無法使用基礎c庫printf,需要使用內核庫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驅動開發筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發雜項設備Demo

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

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

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

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

步驟二:填充file_operations結構體

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

structfile_operationsmisc_fops{
.owner=THIS_MODULE}

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

步驟三:注冊雜項設備并生成設備節點

??注冊到內核:

staticintregisterMiscDev_init(void){
//在內核里面無法使用基礎c庫printf,需要使用內核庫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驅動開發筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發雜項設備Demo

??有注冊就有注銷:

staticintregisterMiscDev_init(void){
//在內核里面無法使用基礎c庫printf,需要使用內核庫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驅動開發筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發雜項設備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,//這個宏是動態分配次設備號,避免沖突
.name="register_hongPangZi_misc",//設備節點名稱
.fops=&misc_fops,//這個變量記住,自己起的,步驟二使用};staticintregisterMiscDev_init(void){
//在內核里面無法使用基礎c庫printf,需要使用內核庫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驅動開發筆記(四):設備驅動介紹、熟悉雜項設備驅動和ubuntu開發雜項設備Demo

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

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

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

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

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

??將驅動拷貝到開發板或者目標系統,然后使用加載指令:

sudoinsmodregisterMiscDev.ko

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

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

dmesg

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

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

??然后注銷:

sudormmodregisterMiscDev.ko

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

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

入坑

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

問題

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

解決

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

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

問題

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

解決

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


延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 曰本三级日本三级日本三级 | 2021国产精品 | 黄色片网站免费观看 | 九一国产精品 | 国产精品中文在线 | 久久综合久久美利坚合众国 | 日本免费大片免费视频 | 在线2区| 一级免费在线视频 | 欧美日韩精品一区二区三区在线观看 | 久久99精品久久久久久青青日本 | 亚洲情在线 | 免费看日韩片 | 一级免费在线视频 | 九九久久视频 | 国产美女三级做爰 | 福利在线免费视频 | 免费的性生活视频 | 日本成人一区二区 | 欧美18—19sex性hd | 国产在线观看91精品 | 羞羞电影在线观看www | 成人羞羞视频在线观看免费 | 大学生一级毛片 | 免费黄色成人 | 欧美视频一区二区三区在线观看 | 国产高潮好爽好大受不了了 | chinese18 xxxx videos | 成人男男视频拍拍拍在线观看 | 欧洲精品色 | 欧美日韩在线播放 | 日本aaaa片毛片免费观蜜桃 | 一本免费视频 | 久久久久久久久久美女 | 欧美一区二区三区久久 | 亚洲成人午夜精品 | 亚洲成人免费影视 | aa国产视频一区二区 | 亚洲爱爱网站 | 日本高清在线免费 | 欧美成人高清在线 |