嵌入式linux字符設備驅動

1. 我們需要先調用register_chrdev_region()或 alloc_chrdev_region()來向系統申請設備號

??? int register_chrdev_region( dev_t first, unsigned int count, char *name );? //函數通過已知的設備號first來注冊字符設備區域。

??? int alloc_chrdev_region( dev_t *dev, unsigned int firstminor,? unsigned int count, char *name );? //若需要動態分配設備號,則使用該函數,此處dev作為指針,為僅用于輸出的參數,分配成功后保存已分配范圍的第一個編號。firstminor通常為0,表示第一個次設備號。

?2.釋放設備號

??? void unregister_chrdev_region( dev_t first, unsigned int count );
3.注冊完字符設備區域之后

??? 需要使用cdev_init函數初始化cdev結構和 file_operations結構

??? cdev->owner = THIS_MODULE;

??? void cdev_init( struct cdev *cdev, struct file_operations *fops);??//為cdev結構指針創建內存,并將cdev->ops=fops;(抵岸科技注:源代碼中并未見創建內存。cdev_init依次做了:cdev填充0,初始化表頭,kobject成員初始化,將cdev->ops=fops)

??? 接著講cdev加入到內核中??? int cdev_add( struct cdev *dev, dev_t num, unsigned int count);

??? 完成字符設備的注冊過程

??? 以上函數需要#include? <linux/cdev.h>

4. 自動創建字符設備節點

??? 下面的函數需要? #include <linux/device.h>.

??? struct class *myclass;? //聲明一個class結構用于創建字符設備節點

??? myclass = class_create(THIS_MODULE,"myclass");? //"myclass"為類名

??? device_create(myclass,NULL,devno,NULL,"leds%d",0);? //通過myclass結構創建字符設備,第二個參數是設備的parent,第三個參

??? 數是設備號,第四個參數是傳入內核的驅動數據void *類型指針,如果沒有可以設置成NULL,最后一個參數是const char* fmt, ...,就是

??? 格式化參數,即leds0

??? 完成上述過程后會在/dev中找到leds0設備

??? 貌似以前的老版本會用到devfs_mk_cdev來創建設備節點,但是最后發現linux-2.6.33并沒有這個函數,應該是被上述函數取代

??? 了吧

5. 當然,還包括驅動Makefile的編寫以及應用程序

??? 幾處比較有用的參考文章:

??? http://hi.baidu.com/hust_junejun/blog/item/d2dcfcedc09833d92e2e213f.html??? //比較全面

??? http://www.dzsc.com/data/html/2009-8-28/78412.html??????????????????????????????????????? //自動生成字符設備節點

????http://fanyihui1986.blog.163.com/blog/static/7844859200911325826783/??????? //小型總結??

6.TIPS

??? printk(KERN_WARNING"?this is the test?");

??? KERN_ALERT

??? KERN_WANING

??? KERN_INFO

??? KERN_ERR

??? 等等不同優先級 宏,具體可以查閱linux設備驅動程序三,字符設備驅動一章。

至于mknod console c 5 1 的意思也很相似:
console是設備的名字
c指字符設備
5是該設備在major.h中定義的標記
1是第一個子設備

mknod console c 5 1
console為設備文件名,自己隨便取
c是指字符型設備 (可選b,塊設備)
5是主設備號 /dev/devices里面記錄現有的設備
找個沒有用的就可以了
1是次設備號,當你要給兩個同樣的設備上一個驅動的時候就要分了,從0開始,1就是第二個了 ,對于字符設備,次設備號就表示同類型設備的不同設備。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253712.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253712.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253712.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數字后端——時鐘樹綜合

在數字集成電路設計中&#xff0c;時鐘信號是數據傳輸的基準&#xff0c;它對于同步數字系統的功能、性能和穩定性起決定性作用&#xff0c;所以時鐘信號的特性及其分配網絡尤被人們關注。時鐘信號通常是整個芯片中有最大扇出、通過最長距離、以最高速度運行的信號。時鐘信號必…

52次課(mysql用戶管理、常用sql語句、 mysql數據庫備份恢復)

MySQL創建用戶以及授權 默認用戶是root用戶&#xff0c;不可能所有人員都用root用戶&#xff0c;創建用戶防止誤刪除&#xff0c;因為mysql里邊有多個庫每個庫里有很多表&#xff0c;所以需要給單獨的用戶做一些授權我只需要它對某一個數據庫有權限&#xff0c;或者說對某個數據…

線程池的種類,區別和使用場景

newCachedThreadPool&#xff1a; 底層&#xff1a;返回ThreadPoolExecutor實例&#xff0c;corePoolSize為0&#xff1b;maximumPoolSize為Integer.MAX_VALUE&#xff1b;keepAliveTime為60L&#xff1b;unit為TimeUnit.SECONDS&#xff1b;workQueue為SynchronousQueue(同步隊…

20145225 《信息安全系統設計基礎》第14周學習總結

第九章 虛擬存儲器 虛擬存儲器是計算機系統最重要的概念之一&#xff0c;它是對主存的一個抽象 三個重要能力&#xff1a; 它將主存看成是一個存儲在磁盤上的地址空間的高速緩存&#xff0c;在主存中只保存活動區域&#xff0c;并根據需要在磁盤和主存之間來回傳送數據&#xf…

數字后端——布線

布線是繼布局和時鐘樹綜合之后的重要物理實施任務&#xff0c;其內容是將分布在芯片核內的模塊、標準單元和輸入輸出接口單元( I /O pad&#xff09;按邏輯關系進行互連&#xff0c;其要求是百分之百地完成它們之間的所有邏輯信號的互連&#xff0c;并為滿足各種約束條件進行優…

動態加載和靜態加載及其編譯步驟

在類unix操作系統中&#xff0c;驅動加載方式一般分為&#xff1a;動態加載和靜態加載&#xff0c;下面分別對其詳細論述。 一、動態加載 動態加載是將驅動模塊加載到內核中&#xff0c;而不能放入/lib/modules/下。 在2.4內核中&#xff0c;加載驅動命令為&#xff1a;ins…

streamsets 集成 minio s3測試

具體streamsets crate 集成可以參考 streamsets crate 以下文檔只關注minio 集成的配置 minio 服務 搭建 具體搭建參考&#xff1a; https://www.cnblogs.com/rongfengliang/p/9197315.html 創建bucket &#xff08;crate 集成使用&#xff09; 測試的csv 文件從https://www.s…

sqlite性能優化

1、數據庫性能上 1.1 批量事務插入&#xff0c;提升數據插入的性能 由于sqlite默認每次插入都是事務&#xff0c;需要對文件進行讀寫&#xff0c;那么減少事務次數就能簡書磁盤讀寫次數從而獲得性能提升。 1.2 單條sql優于多條sql 實測發現&#xff0c;對于幾十條sql插入當你替…

【codecombat】 試玩全攻略 第十四關 已知敵人

第十四關 已知敵人 在這一關里&#xff0c;我們的英雄獲得了一副可以看見敵人的眼鏡&#xff0c;所以他很強勢的學會了“發現敵人”的技能。 hero.findNearestEnemy()命令&#xff0c;單詞多了&#xff0c;首字母都要大寫了&#xff0c;不然分不出來。玩過wow的小伙伴用過 宏命…

數字后端——信號完整性分析

隨著光刻和集成電路制造工藝的不斷進步&#xff0c;以及芯片的特征尺寸從深亞微米到納米的迅速采用&#xff0c;人們一方面因為芯片的功能極大提高而受益&#xff0c;另一方面&#xff0c;當邏輯門的溝道長度減小時&#xff0c;門的開關時間會減小&#xff0c;這意味著輸出驅動…

新浪前端面試

1、什么是Html語義化&#xff1f; 語義化 div > section&#xff0c;div > nav(語言自己能解釋)&#xff0c; input/(關閉符號) br/相對于樣式標記&#xff0c;如 i&#xff08;樣式&#xff09;/ em&#xff08;語義&#xff09;&#xff1b;b&#xff08;樣式&#xff…

poj3278 【BFS】

Catch That CowTime Limit: 2000MS Memory Limit: 65536KTotal Submissions: 97240 Accepted: 30519Description Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a num…

表單高級

● 表單高級 ○ 表單字段集<fieldset></fieldset> ■ 功能&#xff1a;相當于一個方框&#xff0c;在字段集中可以包含文本和其他元素。該元素用于對表單中的元素進行分組并在文檔中區別標出文本。fieldset元素可以嵌套&#xff0c;在其內部可以在設置多個fieldset…

CMOS圖像傳感器——TDI CIS

一、面陣與線陣圖像傳感器 人們在日常生活中見到的相機大多基于普通的面陣圖像傳感器,這種相機多用來拍攝靜止的物體。即使用它們來拍攝運動的物體,也僅僅是縮短了相鄰兩次拍攝的時間間隔,無需對所拍攝圖像進行額外操作,對物體的運動方向和速度也沒有限定條件。 除此之外,…

gpio_request 原形代碼

其原型為 int gpio_request(unsigned gpio, const char *label) 先說說其參數&#xff0c;gpio則為你要申請的哪一個管腳&#xff0c;label則是為其取一個名字。其具體實現如下&#xff1a; [cpp] view plaincopyprint?int gpio_request(unsigned gpio, const char *label) …

【noip模擬】德充符

時間限制&#xff1a;2s 內存限制&#xff1a;512MB 【題目描述】 申徒嘉和鄭子產都是伯昏無人的學生&#xff0c;子產因為申徒嘉是殘疾人&#xff0c;非常看不起他&#xff0c;于是想要刁難他。 子產給了申徒嘉 n個數 a1,a2...an。 現在他要求申徒嘉重新排列這些數&#xff0c…

做好數據挖掘模型的9條經驗總結

愛數據學習社 welcome數據挖掘是利用業務知識從數據中發現和解釋知識(或稱為模式)的過程&#xff0c;這種知識是以自然或者人工形式創造的新知識。當前的數據挖掘形式&#xff0c;是在20世紀90年代實踐領域誕生的&#xff0c;是在集成數據挖掘算法平臺發展的支撐下適合商業分析…

json及JavaBean轉json

先來看看JSON&#xff1a; 什么是JSON&#xff1a; JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。 JSON是用字符串來表示Javascript對象&#xff0c;例如可以在Servlet中發送一個JSON格式的字符串給客戶端Javascript&#xff0c;Javascript可以執行這個字符串…

數字后端——低功耗設計物理實施

一、低功耗設計方案綜述 為了實現集成電路的低功耗設計目標&#xff0c;我們需要在系統設計階段就采用低功耗設計方案&#xff0c;因為隨著設計流程的逐步推進&#xff0c;到了芯片設計實現階段&#xff0c;降低芯片功耗的方法將越來越少&#xff0c;可節省功耗的百分比將不斷下…

Eclipse里修改SVN的用戶名和密碼

刪除Eclipse subclipse plugin中記住的SVN用戶名密碼&#xff1a; 1&#xff09; 查看你的Eclipse中使用的是什么SVN Interface windows > preference > Team > SVN #SVN Interface 2.&#xff09;如果是用的JavaHL, 找到以下目錄并刪除auth目錄. 刪除C:\Users\…