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

Linux字符設(shè)備驅(qū)動(dòng)模型之點(diǎn)亮LED燈

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



本文地址:http://www.qingdxww.cn/thread-360083-1-1.html     【打印本頁(yè)】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
FWW7 發(fā)表于 2017-4-9 10:47:04
Linux驅(qū)動(dòng)這塊有什么不懂的,可加QQ2232894713相互交流學(xué)習(xí)
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊(cè)

廠商推薦

  • Microchip視頻專區(qū)
  • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
  • Dev Tool Bits——使用條件軟件斷點(diǎn)宏來(lái)節(jié)省時(shí)間和空間
  • Dev Tool Bits——使用DVRT協(xié)議查看項(xiàng)目中的數(shù)據(jù)
  • Dev Tool Bits——使用MPLAB® Data Visualizer進(jìn)行功率監(jiān)視
  • 貿(mào)澤電子(Mouser)專區(qū)
關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 在线播放国产一区 | 在线成人免费视频 | 在线精品免费视频 | 成人精品一级毛片 | 欧美日韩精品一区二区在线线 | 男女视频在线观看网站 | 热99精品视频 | 欧美a欧美| 国产久 | 日本高清色本在线www | 午夜美女福利 | 日本免费在线播放 | 欧美成人午夜视频免看 | 91啦视频在线 | 国产三级在线免费 | 国产99视频精品免费视频7 | 国产精品啪 | 777毛片免费 | 国产日韩欧美亚洲综合在线 | 久久综合久久综合久久综合 | 伊人青青草原 | 国产精品福利在线观看免费不卡 | 天堂色| 欧美国产综合视频在线观看 | 国产一级久久久久久毛片 | 在线观看91精品国产剧情免费 | 激情成人综合网 | 九九老司机在线视频精品 | 国产精品亚洲欧美一区麻豆 | 欧美视频在线免费播放 | 色视频网站免费 | 久久久久蜜桃 | 老子影院午夜精品欧美视频 | 一个人www免费观看视频 | 中文国产日韩欧美视频 | 久久亚洲精品国产精品婷婷 | 免费成人高清在线视频 | 国产在线精品一区二区 | 久久青青草原综合伊人 | 免费观看男女羞羞的视频网站 | 四虎影院在线看 |