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的驅動框架有很多 字元裝置驅動框架 塊裝置驅動...