国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

Linux字符設備驅動模型之點亮LED燈

發布時間:2017-4-9 10:45    發布者:FWW7
在前面的文章中,已經描述了整一個字符設備模型,那現在,可以來使用相應的模型進行操作硬件設備了。那么,從點亮一個LED燈開始。
一、設備控制操作
1.理論基礎
大部分驅動程序除了需要提供讀寫設備的能力外,還需要具備控制設備的能力。比如設置UART波特率這樣的操作。
實際上在Linux系統用戶空間中,提供了ioctl系統調用函數來實現了控制設備的操作。其原型如下:
int ioctl(int fd,unsigned long cmd,...)
·fd: 要控制的設備文件描述符
·cmd: 發送給設備的控制命令
·…: 3個參數是可選的參數,存在與否是依賴于控
制命令(2 個參數 )
當應用程序在用戶空間使用ioctl系統調用時,驅動程序將由如下函數來響應:
(1)Linux 2.6.36版本之前的內核
long (*ioctl) (struct inode* node ,struct file* filp, unsigned int cmd,unsigned long arg)
(2)Linux 2.6.36版本之后的內核
long (*unlocked_ioctl) (struct file *filp, unsigned int cmd, unsigned long arg);
·參數cmd: 通過應用函數ioctl傳遞下來的命令
此函數方法由struct file_operations操作函數集實現,如下圖:
在此筆者所使用的是3.0.8版本的Linux內核。
2.控制方法實現
(1)定義命令
命令從其實質而言就是一個整數, 但為了讓這個整數具備更好的可讀性,我們通常會把這個整數分為幾個段:類型(8位),序號,參數傳送方向,參數長度
·Type(類型/幻數): 表明這是屬于哪個設備的命令。
·Number(序號):用來區分同一設備的不同命令。
·Direction:參數傳送的方向,可能的值是 _IOC_NONE(沒有數據傳輸), _IOC_READ, _IOC_WRITE(向設備寫入參數)。
·Size:參數長度
Linux系統提供了下面的宏來幫助定義命令:
·_IO(type,nr):不帶參數的命令
·_IOR(type,nr,datatype):從設備中讀參數的命令
·_IOW(type,nr,datatype):向設備寫入參數的命令
示例:
#define MEM_MAGIC m//定義幻數
#define MEM_SET _IOW(MEM_MAGIC, 0, int)
(2)實現操作
Linux內核操作函數集中的unlocked_ioctl函數的實現通常是根據命令執行的一個switch語句。但是,當命令號不能匹配任何一個設備所支持的命令時,返回-EINVAL.
二、Linux內核空間操作硬件設備
1.確定硬件接口
在操作一個硬件設備前,必須要了解的是其所使用的硬件接口和硬件原理。在此筆者所使用的是S5PV210平臺。
如上圖可知,LED1LED2CPUGPC0_3GPC0_4這兩個I/O口控制,并且GPIO口工作在輸出模式時,當輸出高電平時,燈亮;輸出低電平時,燈滅。
如上圖為GPC0口的控制寄存器GPC0CON(地址為0xe0200060),分析可知,當將[19:12]位配置為[00010001]時,GPC0_3GPC0_4口工作在輸出模式下。
如上圖為GPC0口的數據寄存器GPC0DAT0XE0200064),當I/O口工作在輸出模式時,其每一位代表著每一個GPIO口的電平配置。所以GPC0DAT寄存器的位3代表著GPC0_3口,位4代表GPC0_4口。
在程序頭文件led_driver.h中定義寄存器硬件地址:
2.命令和設備結構體定義
根據ioctl命令的定義方式,在程序頭文件led_driver.h中定義命令,如下圖:
如上圖中定義了一個led設備相關的結構體struct led_device,成員struct class  *led_class;代表led設備類,struct device *led_device;代表了的設備,unsigned int  val;代表其可能需要的配置值。
對于LED的操作而言,實現可以單個點亮或熄滅LED,也可以全部點亮或熄滅LED。所以定義了__LED_SELECT枚舉、ONOFF命令,然后通過__IO()宏進行定義命令。
3.設備驅動模塊初始化
(1)定義struct led_device結構體變量struct led_device *led_dev;和硬件操作相關變量gpc0congpc0dat
并為指針led_device申請內存空間。
(2)靜態申請主設備號
其中LED_MAJOR為靜態定義的主設備號,在程序頭文件led_driver.h中定義。led_fopsstruct file_operations操作函數集。
#define        LED_MAJOR        100
(3)自動創建設備節點文件
首先使用class_create函數創建一個設備類,然后再根據設備類由device_create函數創建一個名為led的設備節點文件,即為當在Linux內核中加載此驅動時,會自動在用戶空間/dev目錄下生成的設備節點文件led
當操作失敗時,處理方式如下:
(4)將硬件設備操作寄存器地址映射為虛擬地址。
Linux內核中,是不允許直接操作設備的物理地址的,智能通過虛擬地址映射的方式進行操作或者配置CPU私有外設的寄存器地址,從而達到操作相關寄存器的目的。
Linux內核中提供了ioremap宏函數來實現物理地址到虛擬地址的映射。
以上操作即為LED設備驅動的初始化函數led_init的實現,源碼如下:
4.設備模塊卸載
設備模塊的卸載主要實現將設備號釋放,銷毀設備節點文件、銷毀設備類,釋放所申請的內存空間。
5.操作函數集的實現
如上圖可知,一共實現了3個操作函數。分別對應于用戶空間的opencloseioctl系統調用的操作。其中led_open操作函數的實現主要進行硬件寄存器的初始化配置。
如上圖即是配置GPC0CON寄存器,將GPC0_3GPC0_4口配置為輸出模式,并初始化GPC0DAT寄存器,保證初始狀態為燈滅。
操作函數led_close的實現不實現任何操作。為空函數。
6.led_ioctl操作函數的實現
如上圖所示,led_ioctl函數通過接受從用戶空間傳遞而來的命令cmd,來決定LED設備的亮滅。以上這種方式是通過直接操作寄存器的方式來實現。實際上在Linux內核中提供了相應的讀寫寄存器的函數方法來實現操作,如下圖:
除了這種方法之外,要操作GOIO口,更可以使用gpio_get_valuegpio_set_value這樣的函數來進行配置GPIO口,對于GPIO口的配置方式,還有更多的實現。
三、Linux用戶空間操作硬件設備
應用程序的實現思路是,從外表為用戶程序提供命令來進行操作LED燈,main函數從外表接收兩個命令:
命令的執行狀態為:./app_led LED編號 狀態
·編號可取值1,2,3,分別表示LED1LED2和全部LED
·狀態可取值01,分別表示燈亮和燈滅。
首先實現判斷外表命令的輸入情況,打開設備文件/dev/led,和將命令由字符轉化為整數。
然后就是點燈功能的實現了。
四、驗證現象
分別編譯好內涵驅動模塊和應用程序,分別得到led_driver.ko文件和app_led文件,然后將他們都拷貝到開發板根文件系統。
執行命令:insmod led_driver.ko插入內核驅動模塊。最后執行應用程序./app_led進行操作LED。如下圖:
至此!整個點燈實現完成。



本文地址:http://m.qingdxww.cn/thread-360083-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
FWW7 發表于 2017-4-9 10:47:04
Linux驅動這塊有什么不懂的,可加QQ2232894713相互交流學習
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • Chiptorials ——使用ATECC608 TrustFLEX實現基本非對稱身份驗證
  • FPGA設計流程培訓教程
  • 無線充電基礎知識及應用培訓教程
  • Chiptorials ——如何將CryptoAuthLib庫用于Microchip安全身份驗證IC
  • 貿澤電子(Mouser)專區
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲永久精品一区二区三区 | 色国产在线视频一区 | 中文字幕一区二区三区免费看 | 日韩欧美一区二区三区中文精品 | 欧美精品免费在线观看 | 日本www在线观看 | 中文字幕成人免费视频 | 小黄鸭视频网站 | 国产免费播放 | 国产精品极品美女自在线观看 | 四虎影8818 | 四虎成人www国产精品 | 精品国产高清久久久久久小说 | 国产精品亚洲精品日韩已方 | a级成人毛片久久 | 99re这里只有 | 久久精品国产在热久久2019 | 99热国产这里只有精品 | 亚洲另类欧美日韩 | 国产偷亚洲偷欧美偷精品 | 产国语一级特黄aa大片 | young sheldon | 最新自拍偷拍 | 福利网站污 | 手机成人在线 | 在线观看国产日韩 | 久久综合精品国产一区二区三区 | 欧美国产一区二区二区 | 国产精品综合视频 | 国产精品福利久久2020 | 欧美影视一区二区三区 | 国产精品短视频 | 日本精品中文字幕在线播放 | 欧美精品日韩一区二区三区 | 91麻豆最新在线人成免费观看 | 免费国产成人高清在线观看麻豆 | 国产精品欧美一区喷水 | 在线视频日本 | 成人性生免费视频 | 亚欧在线观看 | 美女的隐私视频网站蜜桃视频 |