娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

驅動框架入門——以LED為例

發布者:Joyful444Life最新更新時間:2025-01-14 來源: cnblogs關鍵字:驅動框架  LED 手機看文章 掃描二維碼
隨時隨地手機看文章

一、什么是驅動框架?

 

數據結構,這些是驅動框架的直接表現。

 

Linux/init.h中。

 

  • 這個宏的功能是:將其聲明的函數放到一個特定的段:.initcall4.init。

 

(2)分析module_init宏,可以看出它將函數放到了.initcall6.init段中。

  • module_init

  •       __initcall

  •             device_initcall

  •                  __define_initcall('6',fn,6)

 

(3)內核在啟動過程中,需要按照順序執行很多事情。內核如何實現按照先后順序去做很多初始化操作?

 

  • 內核的解決方案就是將內核啟動時要調用的所有函數歸類,然后每個類按照一定的次序去調用執行。

  • 這些分類名就叫.initcalln.init,n的值從1到8。

  • 內核開發者在編寫內核代碼時只要將函數設置合適的級別,鏈接的時候,這些函數就會被放入特定的段,內核啟動時再按照(內核鏈接腳本中指定的)段順序去依次執行各個段即可。內核鏈接腳本(編譯之后才有)在arch/arm/kernel/vmlinux.lds中。

 

(4)經過分析可以看出,subsys_initcall和module_init的作用是一樣的,只不過前者所聲明的函數要比后者在內核啟動時的執行順序更早。

 

3、led_class_attrs

 

(1)什么是attribute?

 

  • 對應將來/sys/class/leds/目錄里的內容,一般是文件和文件夾。

  • 這些文件其實就是sysfs開放給應用層的一些操作接口(非常類似于/dev/目錄下的那些設備文件,對這些設備文件的操作API,對應file_operations里面的函數)。

 

(2)attribute有什么用?

 

  • 讓應用程序可以通過/sys/class/leds/目錄下面的屬性文件來操作驅動進而操作硬件設備。

 

(3)attribute其實是另一條驅動實現的路線(不再有c_dev相關的函數操作),有區別于之前講的file_operations那條線。

 

 

4、led_classdev_register設備注冊函數

 

 

  • led_classdev_register函數創建一個屬于leds這個類的一個設備,其實就是去注冊一個設備。

  • 這個函數是led驅動框架中,內核開發者提供給SoC廠家驅動開發者的一個注冊驅動的接口。

  • 當使用led驅動框架去編寫驅動的時候,這個led_classdev_register函數的作用類似于之前使用file_operations方式去注冊字符設備驅動時的register_chrdev函數。

  • 之前使用file_operations方式時,在sys/class目錄下創建一個類,然后再創建屬于這個類的一個設備。

5、led_classdev結構體

 

  • 在leds.h文件中

 

 

四、在內核中添加或去除某個驅動

1、去除九鼎移植的LED驅動

(1)九鼎移植的驅動(在應用層的接口)在/sys/devices/platform/x210-led/目錄下,有led1、led2、led3、led4四個設備文件,各自管理一個led。

 

  • echo 1 > led1可以點亮其中的led1;

 

(2)要去掉九鼎自己移植的led驅動,要在make menucofig中去掉選擇項,然后重新make得到zImage,然后重啟時啟動這個新的zImage即可。

 

  • 新的內核啟動后,如果/sys/devices/platform/目錄下已經沒有了x210-led這個目錄,就說明我們去掉這個驅動成功了。

 

(3)為什么make menuconfig就能去掉這個驅動?

 

  • 理解make menuconfig的功能。

 

2、添加led驅動框架支持

當前內核中沒有LED驅動框架,要去添加它。(/sys/class目錄下沒有此類,因此要去添加此類)

 

  • 主要是menuconfig的操作。

 

3、sysfs中的內容分析

4、后續展望:完成leds-x210.c





五、基于驅動框架寫led驅動1

1、分析

(1)參考哪里?  drivers/leds/leds-s3c24xx.c文件

(2)關鍵點?led_classdev_register函數

2、動手寫led驅動模塊

代碼如下

注意設備注冊函數、設備注銷函數

 

  1. #include      // module_init  module_exit  

  2. #include            // __init   __exit  

  3. #include   

  4. #include   

  5. #include   

  6. #include   

  7. #include   

  8. #include   

  9.   

  10.   

  11.   

  12. #define GPJ0CON     S5PV210_GPJ0CON  

  13. #define GPJ0DAT     S5PV210_GPJ0DAT  

  14.   

  15. static struct led_classdev mydev;           // 定義結構體變量  

  16.   

  17.   

  18. // 這個函數就是要去完成具體的硬件讀寫任務的  

  19. static void s5pv210_led_set(struct led_classdev *led_cdev,enum led_brightness value)  

  20. {  

  21.     printk(KERN_INFO 's5pv210_led_setn');  

  22.       

  23.     // 在這里根據用戶設置的值來操作硬件  

  24.     // 用戶設置的值就是value  

  25.     if (value == LED_OFF)  

  26.     {  

  27.         // 用戶給了個0,希望LED滅  

  28.         writel(0x11111111, GPJ0CON);  

  29.         writel(((1<<3) | (1<<4) | (1<<5)), GPJ0DAT);  

  30.     }  

  31.     else  

  32.     {  

  33.         // 用戶給的是非0,希望LED亮  

  34.         writel(0x11111111, GPJ0CON);  

  35.         writel(((0<<3) | (0<<4) | (0<<5)), GPJ0DAT);  

  36.     }  

  37. }  

  38.   

  39.   

  40. static int __init s5pv210_led_init(void)  

  41. {  

  42.     // 用戶insmod安裝驅動模塊時會調用該函數  

  43.     // 該函數的主要任務就是去使用led驅動框架提供的設備注冊函數來注冊一個設備  

  44.     int ret = -1;  

  45.       

  46.     mydev.name = 'myled';//設備的名字  

  47.     mydev.brightness = 255;   

  48.     mydev.brightness_set = s5pv210_led_set;  

  49.       

  50.     ret = led_classdev_register(NULL, &mydev);  

  51.     if (ret < 0) {  

  52.         printk(KERN_ERR 'led_classdev_register failedn');  

  53.         return ret;  

  54.     }  

  55.       

  56.     return 0;  

  57. }  

  58.   

  59. static void __exit s5pv210_led_exit(void)  

  60. {  

  61.     led_classdev_unregister(&mydev);  

  62. }  

  63.   

  64.   

  65. module_init(s5pv210_led_init);  

  66. module_exit(s5pv210_led_exit);  

  67.   

  68. // MODULE_xxx這種宏作用是用來添加模塊描述信息  

  69. MODULE_LICENSE('GPL');                          // 描述模塊的許可證  

  70. MODULE_AUTHOR('aston <1264671872@qq.com>');       // 描述模塊的作者  

  71. MODULE_DESCRIPTION('s5pv210 led driver');       // 描述模塊的介紹信息  

  72. MODULE_ALIAS('s5pv210_led');                    // 描述模塊的別名信息  



 

 

六、基于驅動框架寫led驅動2

1、代碼實踐

(1)調試

(2)分析

 

 

 

  • 我們寫的驅動確實工作了,被加載了,/sys/class/leds/目錄下確實多出來了一個表示設備的文件夾。

  • 文件夾里面有相應的操控led硬件的2個屬性brightness和max_brightness。

  • led-class.c中brightness方法有一個show方法和store方法,這兩個方法對應用戶在/sys/class/leds/myled/brightness目錄下直接去讀寫這個文件時實際執行的代碼。

  • 當我們show brightness時,實際就會執行led_brightness_show函數。

  • 當我們echo 1 > brightness時,實際就會執行led_brightness_store函數。

(3)show方法實際要做的就是讀取LED硬件信息,然后把硬件信息返回

  • 因此show方法和store方法會去操控硬件;

  • 但是led-class.c文件又屬于驅動框架中的文件,它本身無法直接讀取具體硬件,因此在show和store方法中使用函數指針的方式調用了struct led_classdev結構體中的相應的讀取/寫入硬件信息的方法。

(4)struct led_classdev結構體中的實際用來讀寫硬件信息的函數,就是我們自己寫的驅動文件leds-s5pv210.c中要提供的。

 

2、添加硬件操作

 

七、基于驅動框架寫led驅動3

1、在驅動中將4個LED分開

(1)好處

 

  • 驅動層實現對各個LED設備的獨立訪問,并向應用層展示出4個操作接口led1、led2、led3、led4,這樣應用層可以完全按照自己的需要對LED進行控制。

  • 驅動的設計理念:不要對最終需求功能進行假定(不能假定用戶進行什么操作,比如是幾個led一起操作還是一個操作而已?),而應該只是直接的對硬件的操作。

  • 有一個概念就是:機制和策略的問題。在硬件操作上驅動只應該提供機制(具體實現)而不是策略(方法、主意、解決方案)。策略由應用程序來做。

 

(2)如何實現

 

  1. #include      // module_init  module_exit  

  2. #include            // __init   __exit  

  3. #include   

  4. #include   

  5. #include   

  6. #include   

  7. #include   

  8. #include   

  9.   

  10.   

  11.   

  12. #define GPJ0CON     S5PV210_GPJ0CON  

  13. #define GPJ0DAT     S5PV210_GPJ0DAT  

  14.   

  15. static struct led_classdev mydev1;          // 定義結構體變量  

  16. static struct led_classdev mydev2;          // 定義結構體變量  

  17. static struct led_classdev mydev3;          // 定義結構體變量  

[1] [2] [3] [4]
關鍵字:驅動框架  LED 引用地址:驅動框架入門——以LED為例

上一篇:tiny210V2 Uboot kernel filesystem 燒寫和啟動
下一篇:INPUT輸入子系統——按鍵

推薦閱讀最新更新時間:2025-04-07 06:52

Linux驅動之USB總線驅動程序框架簡析
通用串行總線(USB)是主機和外圍設備之間的一種連接。USB總線規范有1.1版和2.0版,當然現在已經有了3.0版本。USB1.1支持兩種傳輸速度:低速為1.5Mbps,高速為12Mbps。USB2.0的傳輸速度可以高達480Mbps。USB2.0向下兼容USB1.1,可以將USB1.1的設備連接到USB2.0控制器上,也可以把USB2.0的設備連接到USB1.1控制器上。S3C2440的USB主機控制器支持USB1.1總線規范。 USB總線的拓撲結構如下圖所示:USB主機控制器(USB Host Controller)通過根集線器(Root Hub)與其他USB設備相連。集線器也屬于USB設備,通過它可以在一個USB接口上擴展出
[單片機]
Linux<font color='red'>驅動</font>之USB總線<font color='red'>驅動</font>程序<font color='red'>框架</font>簡析
基于杰發科技AC7840x的Mini LED背光驅動設計
應用場景: 在汽車應用中,Mini LED背光驅動設計主要用于儀表盤、中控屏和車載娛樂系統等顯示屏。這項技術可以顯著提升顯示效果,提供更高的亮度、更深的黑色和更廣的色域,使得圖像更加生動逼真,尤其在強光和寬溫度范圍下表現出色。Mini LED背光驅動還可以實現更精細的區域調光,減少光暈效應,提高對比度和細節表現,從而提升駕駛員的可讀性和安全性。此外,Mini LED背光技術能夠提高能效,延長顯示器的使用壽命,并具備更高的可靠性,能夠適應汽車環境的嚴苛要求,包括振動和溫度變化。這些優勢使得Mini LED背光驅動成為現代汽車顯示系統中不可或缺的關鍵技術。 基于以上應用場景,我們開發了一款汽車智能交互燈方案,采用杰發科技系列MCU
[嵌入式]
基于杰發科技AC7840x的Mini <font color='red'>LED</font>背光<font color='red'>驅動</font>設計
基于51單片機,蜂鳴器和led每秒1滴1亮的程序
#include reg52.h #define uchar unsigned char #define uint unsigned int int seccnt,m=0; char tzsta,msta; sbit led=P2^0; sbit beep=P1^5; void ini()//定時器0 { seccnt=0; msta=tzsta=0; TMOD=0x01; TH0=0x0FF; TL0=0x9C; TR0=1; } void on()//蜂鳴器和燈的功能 { if(m =500) { beep=~beep; } if(m =100
[單片機]
mini2440(2) LED燈裸機硬件控制程序
查找mini2440的原理圖,找到LED部分的原理圖: 然后查找nLED_1到nLED_4分別連接的S3C2440的引腳: 由圖可知: nLED_1---GPB5 nLED_2---GPB6 nLED_3---GPB7 nLED_4---GPB8 在S3C2440的引腳劃分中,這四個引腳都屬于Port B,因此可以通過配置Port B的控制寄存器對這四個引腳的功能進行配置: 如果要讓LED燈亮,nLED_1到nLED_4端需要低電平,因此GPB5到GPB8引腳需要: (1)輸出:GPBCON 因此,GPBCON寄存器的11,13,15,17位要設置為0,而10,12,14,16位要設置為1,而且我們還知道GPBCO
[單片機]
mini2440(2) <font color='red'>LED</font>燈裸機硬件控制程序
深度分析:京東方華燦光電為何發力車載LED市場
近日,京東方華燦光電在官微表示將發力車載LED市場。 近年來,國產新能源汽車市占率逐年攀升,據政府工作報告數據,2023年新能源汽車產銷量占全球比重超過60%,加之智能座艙概念興起,LED屏幕和燈光迎來新的需求。 一時間,車用LED也出現了百舸爭流的局面——車載LED的應用形式增加,新技術新產品的層出不窮推進供應鏈加速上車,企業也紛紛布局車載LED戰略。 市場進度:車燈、車載屏應用場景多樣化 在分析京東方華燦光電車載LED戰略前,我們先來看看目前車用LED應用進度,為何車載LED引各企業角逐。 LED分類中主要為燈和屏,在汽車應用場景里,可演化為了ADB像素大燈、交互燈、多元氛圍燈、中控屏、抬頭顯示等一系列車載
[汽車電子]
深度分析:京東方華燦光電為何發力車載<font color='red'>LED</font>市場
STM8L151C8學習筆記1:LED驅動
按以往的單片機開發流程,第一步先來點個燈。 基于STM8與STM32同屬STM系列,要想點亮一個燈,所需步驟不過就三步: 開啟相應時鐘 初始化GPIO模式 拉高/置低來點亮LED 硬件電路 主控部分: LED電路: 代碼編寫 1.led.c 部分內容如下: #include led.h /*GPIO*/ #define LED_PORT GPIOA #define LED1_PIN GPIO_Pin_6 #define LED2_PIN GPIO_Pin_7 /*LED*/ #define LED1 GPIO_Pin_6 #define
[單片機]
STM8L151C8學習筆記1:<font color='red'>LED</font><font color='red'>驅動</font>
LED透明屏的常見的4種檢修方法
LED透明屏壽命長短除了產品本身的質量之外,檢修保養也是一個重要關鍵,LED透明屏與其它任何的產品一樣出現問題也是情理之中,我們能做到的是在問題來臨之前更好的發現于它,盡可能的提前做好維修工作。LED透明屏的維修檢測方法有哪些? 1、電阻檢測法 我們需將萬用表調到電阻檔,先檢測一塊正常電路板的某點到地電阻值,然后再檢測另一塊相同電路板的同一個點測試與正常的電阻值是否有不同,如有不同則就知道了該透明屏問題的范圍,反之則不理會。 2、電壓檢測法 透明屏電壓檢測是將萬用表調到電壓檔,檢測有可疑有問題的電路某個點的到地電壓,與之前比較是否正常,如此便可方便的確定問題的所在。 3、短路檢測法 將萬用表調到短路檢測擋,如此一來可以
[測試測量]
<font color='red'>LED</font>透明屏的常見的4種檢修方法
LED產品訂單增長明顯 國星光電Q3凈利潤預增超過440%
10月14日,國星光電發布業績預告稱,公司預計2021年前三季度實現歸屬于上市公司股東的凈利潤為1.70億元-1.86億元,同比增長120%-140%,上年同期盈利為0.77億元。 其中,預計7-9月預計實現歸屬于上市公司股東的凈利潤為0.79億元-0.94億元,同比增長440%-547%,上年同期盈利為0.15億元。 關于業績變動的原因,國星光電表示,報告期內,國內疫情防控穩定,市場需求持續回暖,公司產品訂單量較去年同期取得明顯增長;另一方面公司圍繞生產經營目標與重點工作計劃,調整產品結構,增加高附加值產品,并有序推進擴產項目,提升公司規模和技術能力。 另外,前三季度,國星光電非經常性損益金額區間約為3,400萬元-3,60
[手機便攜]
<font color='red'>LED</font>產品訂單增長明顯 國星光電Q3凈利潤預增超過440%
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 赫章县| 庐江县| 西平县| 城口县| 德兴市| 南靖县| 安多县| 饶河县| 沾化县| 塔城市| 鸡东县| 祁连县| 仪征市| 漳州市| 从江县| 隆子县| 吉林市| 武功县| 台山市| 木兰县| 永兴县| 卫辉市| 楚雄市| 临朐县| 广宁县| 武定县| 临邑县| 海口市| 霍城县| 松潘县| 阿拉善左旗| 万载县| 海丰县| 遂川县| 峡江县| 天等县| 惠安县| 县级市| 舞阳县| 怀化市| 绥中县|