freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

第11章 嵌入式linux設(shè)備驅(qū)動開發(fā)(文件)

2025-02-21 17:43 上一頁面

下一頁面
 

【正文】 空間的緩沖區(qū)中或者相反。 ioctl ? 大部分設(shè)備除了讀寫操作,還需要硬件配置和控制(例如,設(shè)置串口設(shè)備的波特率)等很多其他操作。與malloc()不同, kmalloc()申請空間有大小限制。 ? get_dma_pages():獲得用于 DMA傳輸?shù)捻撁妗? proc文件系統(tǒng) ( 1) /proc文件系統(tǒng)是一個偽文件系統(tǒng),它是一種內(nèi)核和內(nèi)核模塊用來向進(jìn)程發(fā)送信息的機制。 proc文件系統(tǒng) ( 2) GPIO驅(qū)動程序?qū)嵗? GPIO工作原理 ? FS2410開發(fā)板的 S3C2410處理器具有 117個多功能通用 I/O( GPIO)端口管腳,包括 GPIO 8個端口組,分別為 GPA( 23個輸出端口)、 GPB( 11個輸入 /輸出端口)、 GPC( 16個輸入 /輸出端口)、 GPD( 16個輸入 /輸出端口)、GPE( 16個輸入 /輸出端口)、 GPF( 8個輸入 /輸出端口)、GPH( 11個輸入 /輸出端口)。因為大部分 I/O管腳可以提供多種功能,通過配置寄存器( PnCON)設(shè)定每個管腳用于何種目的。4個 LED分別在對應(yīng)端口( GPF4~GPF7)為低電平時發(fā)亮,而蜂鳴器在GPB0為高電平時發(fā)聲。在下一個小節(jié)中介紹的驅(qū)動程序中, s3c2410_gpio_cfgpin()函數(shù)和 s3c2410_gpio_pullup()函數(shù)將進(jìn)行對某個端口的配置,而 s3c2410_gpio_setpin()函數(shù)實現(xiàn)向數(shù)據(jù)寄存器的某個端口的輸出。它的驅(qū)動程序的編寫過程與字符型設(shè)備驅(qū)動程序的編寫有很大的區(qū)別。 塊設(shè)備驅(qū)動工作流程 ? 塊設(shè)備驅(qū)動程序的編寫流程同字符設(shè)備驅(qū)動程序的編寫流程很類似,也包括了注冊和使用兩部分。每個 gendisk中包含了本物理實體的全部信息以及操作函數(shù)接口。 /* 第一個次設(shè)備號 */ int minors。 /* 分區(qū)表 */ struct block_device_operations *fops。 /* 塊設(shè)備可包含的扇區(qū)數(shù) */ …… /* 其他省略 */ }。 long (*unlocked_ioctl) (struct file *, unsigned, unsigned long)。 int (*revalidate_disk) (struct gendisk *)。 塊設(shè)備驅(qū)動程序也包含一個在 linux/中定義的block_device_operations結(jié)構(gòu)塊設(shè)備并不提供 read()、 write()等函數(shù)接口。參數(shù) name為設(shè)備名,在/proc/devices中顯示。如果出錯則返回負(fù)值。 int register_blkdev(unsigned int major, const char *name)。在卸載 gendisk結(jié)構(gòu)的時候,要調(diào)用 del_gendisk()函數(shù)。 中斷編程 中斷編程接口( 1) ? 實際上,有很多 Linux的驅(qū)動都是通過中斷的方式來進(jìn)行內(nèi)核和硬件的交互。 ? 申請中斷使用 request_irq()調(diào)用,釋放中斷使用 free_irq()調(diào)用。在 Intel平臺,范圍是 0~ 15。 ? 參數(shù) irqflags是中斷處理的一些屬性,其中比較重要的有SA_INTERRUPT。還有一個 SA_SHIRQ屬性,設(shè)置了以后運行多個設(shè)備共享中斷,在中斷處理程序中根據(jù)dev_id區(qū)分不同設(shè)備產(chǎn)生的中斷。中斷處理程序可以用 dev_id找到相應(yīng)的控制這個中斷的設(shè)備,或者用 irq2dev_map()找到中斷對應(yīng)的設(shè)備。在圖 117的 4 X 4矩陣按鍵( K1~K16)電路中,使用 4個輸入 /輸出端口( EINT0、EINT EINT11和 EINT19)和 4個輸出端口( KSCAN0~KSCAN3)。例如,如果產(chǎn)生了外部 2號線中斷( EINT2變?yōu)榈碗娖剑?,則表示 K K K9和 K15中至少有一個按鍵被按住了。在 4個 KSCAN端口中,輪流將其中某一個端口的輸出置為低電平,其他 3個端口的輸出置為高電平。 ? 實際的按鍵動作會在短時間(幾毫秒至幾十毫秒)內(nèi)產(chǎn)生信號抖動。 按鍵驅(qū)動程序 ? 閱讀并運行示例 116。 $ armlinuxgcc –o butt_test $ ./butt_test 測試程序中,首先打開按鍵設(shè)備文件和 gpio設(shè)備(包括 4個 LED和蜂鳴器)文件,接下來,根據(jù)按鍵的輸入值(按鍵 ID)的二進(jìn)制形式,LED D9~D12發(fā)亮(例如,按下 11號按鍵,則 D D10和 D12會發(fā)亮),而蜂鳴器當(dāng)每次按鍵時發(fā)出聲響。 實驗運行結(jié)果 $ make clean。quit39。 。quit39。quit39。讀者可以體會到字符設(shè)備驅(qū)動的整個編寫流程。make /* 驅(qū)動程序的編譯 */ $ insmod /* 加載 buttons設(shè)備驅(qū)動 */ $ cat /proc/devices /* 通過這個命令可以查到 buttons設(shè)備的主設(shè)備號 */ $ mknod /dev/buttons c 252 0 /* 假設(shè)主設(shè)備號為 252, 創(chuàng)建設(shè)備文件節(jié)點 */ $ make clean。一次按鍵操作將會產(chǎn)生若干次按鍵中斷,從而會產(chǎn)生抖動現(xiàn)象。例如,在確認(rèn)產(chǎn)生了外部 2號中斷之后,進(jìn)行逐列掃描。 按鍵驅(qū)動程序原理( 2) ? 在確定按鍵操作所在行的位置之后,我們還得查看按鍵操作所在列的位置。那怎么樣才能及時而準(zhǔn)確地對矩陣按鍵進(jìn)行掃描呢? ? 某個中斷的產(chǎn)生表示,與它所對應(yīng)的矩陣行的 4個按鍵中,至少有一個按鍵被按住了。按鍵同樣使用 GPIO接口,但按鍵本身需要外部的輸入,即在驅(qū)動程序中要處理外部中斷。 ? 參數(shù) dev_id在中斷共享時會用到。快速處理程序被調(diào)用時屏蔽所有中斷。這是一個回調(diào)函數(shù),中斷發(fā)生時,系統(tǒng)調(diào)用這個函數(shù),傳入的參數(shù)包括硬件中斷號、設(shè)備 id以及寄存器值。 void free_irq(unsigned int irq, void *dev_id)。硬件設(shè)備在發(fā)生某個事件時通過中斷通知軟件進(jìn)行處理。從塊設(shè)備的運行流程,可知請求處理是塊設(shè)備的基本處理單位,也是最核心的部分。 struct request_queue *blk_init_queue(request_fn_proc *rfn, spinlock_t *lock) 塊設(shè)備注冊和初始化( 3) ( 3)初始化并注冊 gendisk結(jié)構(gòu) 首先使用 alloc_disk()函數(shù)動態(tài)分配 gendisk結(jié)構(gòu),接下來,對 gendisk結(jié)構(gòu)的主設(shè)備號( major)、次設(shè)備號相關(guān)成員( first_minor和 minors)、塊設(shè)備操作函數(shù)( fops)、請求隊列( queue)、可包含的扇區(qū)數(shù)( capacity)以及設(shè)備名稱( disk_name)等成員進(jìn)行初始化。 其中參數(shù) rfn是請求隊列的處理函數(shù)指針,它負(fù)責(zé)執(zhí)行塊設(shè)備的讀、
點擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1