Linux 字元裝置驅動基本框架(二)

2021-10-05 23:25:05 字數 1538 閱讀 2141

一、位址對映

我們知道 stm32 無法跑 linux 系統,是由於它內部沒有 mmu(記憶體管理單元),mmu 主要完成的功能如下:

(1)完成虛擬空間到物理空間的對映。

(2)記憶體保護,設定儲存器的訪問許可權,設定虛擬儲存空間的緩衝特性。

linux 核心啟動的時候會初始化 mmu,設定好記憶體對映,設定好以後 cpu 訪問的都是虛擬位址 。

如:i.mx6ull 的 gpio1_io03 引腳的復用暫存器 iomuxc_sw_mux_ctl_pad_gpio1_io03 位址為 0x020e0068。如果沒有開啟 mmu,直接向 0x020e0068 位址處寫入資料即可配置復用功能。但現在開啟了 mmu 並設定了記憶體對映,因此就不能直接向 0x020e0068 這個位址寫入資料了。我們必須得到 0x020e0068 這個實體地址在 linux 系統裡面對應的虛擬位址,這裡就涉及到了物理記憶體和虛擬記憶體之間的轉換,需要用到兩個函式:ioremap 和 iounmap。

1、ioremap 函式

用於獲取指定實體地址空間對應的虛擬位址空間。

函式原型:void __iomem *

ioremap

(cookie,size)

// cookie-物理起始位址 size-對映位元組數

#define sw_mux_gpio1_io03_base (0x020e0068)

static

void __iomem* sw_mux_gpio1_io03;

sw_mux_gpio1_io03 =

ioremap

(sw_mux_gpio1_io03_base,4)

;

2、iounmap 函式

解除安裝驅動時需要使用 iounmap 函式釋放掉 ioremap 函式所做的對映。

函式原型:void iounmap (

volatile

void __iomem *addr)

__iomem 是什麼意思?

#define __iomem __attribute((noderef,address_space(2)))

二、 i/o 記憶體訪問函式

1、讀操作函式

u32 readl

(const

volatile

void __iomem *addr)

// 32bit 讀操作,返回值是讀到的值

2、寫操作函式

void

writel

(u32 value,

volatile

void __iomem *addr)

// 32bit 寫操作

Linux 字元裝置驅動基本框架(三)

前面的字元裝置驅動框架有缺點,如 1 register chrdev 函式只能指定主裝置號,無法指定次裝置號,會將乙個主裝置號下的所有次裝置號都使用掉。2 不能自動分配裝置號,需要在程式中利用巨集定義指定裝置號。2 不能自動建立裝置節點,需要手動 mknod dev c 主裝置號 次裝置號 我們接下...

linux 字元裝置驅動框架

linux 字元裝置驅動是3種型別中最簡單的一種,其實就是實現 file operations 中的函式,基本實現框架如下 1,需要包含的標頭檔案 include include include include include 2.定義及實現 file operations 中的函式,file op...

Linux字元裝置驅動框架總結

對於linux而言,一切皆檔案,在linux系統下,所有檔案都可以像文字檔案一樣open read write,那麼對於linux裝置驅動而言,比如現在有乙個點燈的驅動程式,它的裝置節點是 dev 當應用程式執行open read write的時候,是如何呼叫到驅動程式裡的open read wri...