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

正文內(nèi)容

第11章嵌入式linux設備驅(qū)動開發(fā)(編輯修改稿)

2025-02-27 17:43 本頁面
 

【文章內(nèi)容簡介】 使用)。 ? 釋放打開設備時系統(tǒng)所分配的內(nèi)存空間(包括 filpprivate_data指向的內(nèi)存空間)。 ? 在最后一次釋放設備操作時關閉設備。 讀寫設備 ? 讀寫設備的主要任務就是把內(nèi)核空間的數(shù)據(jù)復制到用戶空間,或者從用戶空間復制到內(nèi)核空間,也就是將內(nèi)核空間緩沖區(qū)里的數(shù)據(jù)復制到用戶空間的緩沖區(qū)中或者相反。 內(nèi)核空間和用戶空間的數(shù)據(jù)交換 ? 內(nèi)核空間地址和用戶空間地址是有很大區(qū)別的,其中一個區(qū)別是用戶空間的內(nèi)存是可以被換出的,因此可能會出現(xiàn)頁面失效等情況。所以不能使用諸如 memcpy()之類的函數(shù)來完成這樣的操作。在這里要使用 copy_to_user()或copy_from_user()等函數(shù),它們是用來實現(xiàn)用戶空間和內(nèi)核空間的數(shù)據(jù)交換的。 ioctl ? 大部分設備除了讀寫操作,還需要硬件配置和控制(例如,設置串口設備的波特率)等很多其他操作。在字符設備驅(qū)動中 ioctl函數(shù)接口給用戶提供對設備的非讀寫操作機制。 獲取內(nèi)存 ( 1) ? 在應用程序中獲取內(nèi)存通常使用函數(shù) malloc(),但在設備驅(qū)動程序中動態(tài)開辟內(nèi)存可以以字節(jié)或頁面為單位。其中,以字節(jié)為單位分配內(nèi)存的函數(shù)有 kmalloc(),注意的是,kmalloc()函數(shù)返回的是物理地址,而 malloc()等返回的是線性虛擬地址,因此在驅(qū)動程序中不能使用 malloc()函數(shù)。與malloc()不同, kmalloc()申請空間有大小限制。長度是 2的整次方,并且不會對所獲取的內(nèi)存空間清零。 ? 以頁為單位分配內(nèi)存的函數(shù)如下所示: ? get_zeroed_page():獲得一個已清零頁面。 ? get_free_page():獲得一個或幾個連續(xù)頁面。 ? get_dma_pages():獲得用于 DMA傳輸?shù)捻撁妗? ? 與之相對應的釋放內(nèi)存用也有 kfree()或 free_page函數(shù)族。 獲取內(nèi)存 ( 2) 獲取內(nèi)存 ( 3) 獲取內(nèi)存 ( 4) 打印信息 ? 在內(nèi)核空間要用函數(shù) printk()而不能用平常的函數(shù) printf()。 printk()還可以定義打印消息的優(yōu)先級。 proc文件系統(tǒng) ( 1) /proc文件系統(tǒng)是一個偽文件系統(tǒng),它是一種內(nèi)核和內(nèi)核模塊用來向進程發(fā)送信息的機制。這個偽文件系統(tǒng)讓用戶可以和內(nèi)核內(nèi)部數(shù)據(jù)結構進行交互,獲取有關系統(tǒng)和進程的有用信息,在運行時通過改變內(nèi)核參數(shù)來改變設置。與其他文件系統(tǒng)不同, /proc存在于內(nèi)存之中而不是在硬盤上。讀者可以通過“ ls”查看 /proc文件系統(tǒng)的內(nèi)容。 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個輸入 /輸出端口)。根據(jù)各種系統(tǒng)設計的需求,通過軟件方法可以將這些端口配置成具有相應功能(例如:外部中斷或數(shù)據(jù)總線)的端口。 ? 為了控制這些端口, S3C2410處理器為每個端口組分別提供幾種相應的控制寄存器。其中最常用的有端口配置寄存器( GPACON ~ GPHCON)和端口數(shù)據(jù)寄存器( GPADAT ~ GPHDAT)。因為大部分 I/O管腳可以提供多種功能,通過配置寄存器( PnCON)設定每個管腳用于何種目的。數(shù)據(jù)寄存器的每位將對應于某個管腳上的輸入或輸出。所以通過對數(shù)據(jù)寄存器( PnDAT)的位讀寫,可以進行對每個端口的輸入或輸出。 LED和蜂鳴器驅(qū)動電路 可知使用 S3C2410處理器的通用 I/O口 GPFGPF GPF6和 GPF7分別直接驅(qū)動 LED D1D1 D10以及 D9,而使用 GPB0端口驅(qū)動蜂鳴器。4個 LED分別在對應端口( GPF4~GPF7)為低電平時發(fā)亮,而蜂鳴器在GPB0為高電平時發(fā)聲。這 5個端口的數(shù)據(jù)流方向均為輸出。 主要控制寄存器( 1) 主要控制寄存器( 2) 為了驅(qū)動 LED和蜂鳴器,首先通過端口配置寄存器將 5個相應寄存器配置為輸出模式。然后通過對端口數(shù)據(jù)寄存器的寫操作,實現(xiàn)對每個 GPIO設備的控制(發(fā)亮或發(fā)聲)。在下一個小節(jié)中介紹的驅(qū)動程序中, s3c2410_gpio_cfgpin()函數(shù)和 s3c2410_gpio_pullup()函數(shù)將進行對某個端口的配置,而 s3c2410_gpio_setpin()函數(shù)實現(xiàn)向數(shù)據(jù)寄存器的某個端口的輸出。 GPIO驅(qū)動程序 ? 閱讀并運行 1132 $ make clean。make /* 驅(qū)動程序的編譯 */ $ insmod /* 加載 gpio驅(qū)動 */ $ cat /proc/devices /* 通過這個命令可以查到 gpio設備的主設備號 */ $ mknod /dev/gpio c 252 0 /* 假設主設備號為 252, 創(chuàng)建設備文件節(jié)點 */ $ armlinuxgcc –o gpio_test $ ./gpio_test 運行結果為 4個 LED輪流閃爍,同時蜂鳴器以一定周期發(fā)出聲響。 塊設備驅(qū)動編程 塊設備驅(qū)動 ? 塊設備通常指一些需要以塊(如 512字節(jié))的方式寫入的設備,如 IDE硬盤、 SCSI硬盤、光驅(qū)等。它的驅(qū)動程序的編寫過程與字符型設備驅(qū)動程序的編寫有很大的區(qū)別。 ? 塊設備驅(qū)動編程接口相對復雜,不如字符設備明晰易用。塊設備驅(qū)動程序?qū)φ麄€系統(tǒng)的性能影響較大,速度和效率是設計塊設備驅(qū)動程要重點考慮的問題。系統(tǒng)中使用緩沖區(qū)與訪問請求的優(yōu)化管理(合并與重新排序)來提高系統(tǒng)性能。 塊設備驅(qū)動工作流程 ? 塊設備驅(qū)動程序的編寫流程同字符設備驅(qū)動程序的編寫流程很類似,也包括了注冊和使用兩部分。但與字符驅(qū)動設備所不同的是,塊設備驅(qū)動程序包括一個 request請求隊列。它是當內(nèi)核安排一次數(shù)據(jù)傳輸時在列表中的一個請求隊列,以最大化系統(tǒng)性能為原則進行排序。 用 戶 調(diào) 用模 塊 i n i t _ m o d u l e ( ) c l e a n u p _ m o d u l e ( )內(nèi) 核注 冊 設 備卸 載 設 備設 備 功 能 i n s m o d r m m o d請 求 處 理重要數(shù)據(jù)結構( 1) ? 每個塊設備物理實體由一個 gendisk結構體來表示,每個 gendisk可以支持多個分區(qū)。每個 gendisk中包含了本物理實體的全部信息以及操作函數(shù)接口。整個塊設備的注冊過程是圍繞 gendisk來展開的 。 struct gendisk {
點擊復制文檔內(nèi)容
教學課件相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1