linux字元裝置驅動開發之記憶體對映

2021-09-30 16:09:15 字數 4402 閱讀 3154

linux驅動最終都死通過配置暫存器完成,linux驅動開發需要滿足linux的驅動框架.所以存在乙個記憶體管理單元(mmu)實現虛擬位址與實體地址的對映,記憶體保護和虛擬位址快取功能.

通過記憶體對映,只需要對虛擬位址進行操作,就可以實現相應的驅動開發.

記憶體對映

對映函式

//記憶體對映

void __iomem *

ioremap

(phys_addr_t addr,

unsigned

long size)

//取消對映

void

iounmap

(void __iomem *addr)

io讀寫函式

//讀寫虛擬位址

static

inline u8 readb

(const

volatile

void __iomem *addr)

static

inline u16 readw

(const

volatile

void __iomem *addr)

static

inline u32 readl

(const

volatile

void __iomem *addr)

static

inline

void

writeb

(u8 data,

volatile

void __iomem *addr)

static

inline

void

writew

(u16 data,

volatile

void __iomem *addr)

static

inline

void

writel

(u32 data,

volatile

void __iomem *addr)

記憶體對映簡單例子

// physical address

#define ccm_ccgr1_base (0x020c406c)

#define sw_mux_gpio1_io03_base (0x020e0068)

#define sw_pad_gpio1_io03_base (0x020e02f4)

#define gpio1_dr_base (0x0209c000)

#define gpio1_gdir_base (0x0209c004)

// virtual address

static

void __iomem *imx6u_ccm_ccgr1;

static

void __iomem *sw_mux_gpio1_io03;

static

void __iomem *sw_pad_gpio1_io03;

static

void __iomem *gpio1_dr;

static

void __iomem *gpio1_gdir;

imx6u_ccm_ccgr1 =

ioremap

(ccm_ccgr1_base,4)

;sw_mux_gpio1_io03 =

ioremap

(sw_mux_gpio1_io03_base,4)

;sw_pad_gpio1_io03 =

ioremap

(sw_pad_gpio1_io03_base,4)

;gpio1_dr =

ioremap

(gpio1_dr_base,4)

;gpio1_gdir =

ioremap

(gpio1_gdir_base,4)

;iounmap

(ccm_ccgr1_base)

;iounmap

(sw_mux_gpio1_io03_base)

;iounmap

(sw_pad_gpio1_io03_base)

;iounmap

(gpio1_dr_base)

;iounmap

(gpio1_gdir_base)

;

完整例子

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define led_major 200

#define led_name 'led'

#define ledoff 0

#define ledon 1

// physical address

#define ccm_ccgr1_base (0x020c406c)

#define sw_mux_gpio1_io03_base (0x020e0068)

#define sw_pad_gpio1_io03_base (0x020e02f4)

#define gpio1_dr_base (0x0209c000)

#define gpio1_gdir_base (0x0209c004)

// virtual address

static

void __iomem *imx6u_ccm_ccgr1;

static

void __iomem *sw_mux_gpio1_io03;

static

void __iomem *sw_pad_gpio1_io03;

static

void __iomem *gpio1_dr;

static

void __iomem *gpio1_gdir;

// open or close led

void

led_switch

(uint8_t sta)

else

if(sta == ledoff)

}// open device

static

intled_open

(struct inode *inode ,

struct file *flip)

// release device

static

intled_release

(struct inode *inode,

struct file *filp)

// read data

static ssize_t led_read

(struct file *filp,

char __user *buf, size_t cnt, loff_t *offt)

// write data

static ssize_t led_write

(struct file *filp,

const

char __user *buf, size_t cnt, loff_t *offt)

ledstat = databuf[0]

;if(ledstat == ledon)

else

if(ledstat == ledoff)

return0;

}// device operation

static

struct file_operation led_fops =

;// device init

static

int __init led_init

(void

)return0;

}}// device exit

static

void __exit led_exit

(void

)module_init

(led_init)

;module_exit

(led_exit)

;module_license

("gpl");

module_author

("tan"

);

驅動 linux裝置驅動 字元裝置驅動開發

preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...

Linux裝置驅動之記憶體對映

linux裝置驅動之記憶體對映 日期 2011 04 11 1.記憶體對映 所謂的記憶體對映就是把物理記憶體對映到程序的位址空間之內,這些應用程式就可以直接使用輸入輸出的位址空間,從而提高讀寫的效率。linux提供了mmap 函式,用來對映物理記憶體。在驅動程式中,應用程式以裝置檔案為物件,呼叫mm...

linux核心字元裝置驅動開發

1,對驅動的理解 對於一般驅動程式來說,只需要配置控制器的暫存器就可以 但是在linux作業系統中,軟體要讓硬體辦事,就要滿足硬體的規矩,也就是按驅動框架來開發硬體驅動程式 驅動程式就要受到linux的約束,這個約束就被稱為linux驅動框架。linux的驅動框架有很多 字元裝置驅動框架 塊裝置驅動...