led linux驅動程式
測試平台:xunlong orange pi zero
驅動程式以及makefile如下:
#include
#include
#include
#include
#include
#include
static
struct
class *sun8i_opizero_led_class;
//status-led:pa17
#define pio_base 0x1c20800
volatile
unsigned
long *pacfg[4] = ;
volatile
unsigned
long *padat = null;
static
int sun8i_opizero_led_open(struct inode *inode, struct file *file)
static ssize_t sun8i_opizero_led_write(struct file *file, const
char __user *buf, size_t count, loff_t *ppos)
static
struct file_operations sun8i_opizero_led_fops = ;
int major;
int sun8i_opizero_led_init(void)
static
void sun8i_opizero_led_exit(void)
module_init(sun8i_opizero_led_init);
module_exit(sun8i_opizero_led_exit);
module_description("led driver for xunlong orange pi zero");
module_author("techping chan ");
module_license("gpl");
module_alias("platform:orange-pi-zero-led");
obj-m := sun8i_opizero_led.o
#編譯進模組
kerneldir := /lib/modules/3.4
.113-sun8i/build #此處為linux核心庫目錄
pwd := $(shell pwd) #獲取當前目錄
output := $(obj-m) $(obj-m:.o=.ko) $(obj-m:.o=.mod
.o) $(obj-m:.o=.mod
.c) modules.order module.symvers
modules:
$(make) -c $(kerneldir) m=$(pwd) modules
clean:
rm -rf $(output)
在shell中使用以下命令裝載驅動程式:
$ make
$ insmod sun8i_opizero_led.ko
使用linux c進行測試:
#include
#include
#include
#include
int main(int argc, char **argv)
if (strcmp(argv[1], "on") == 0)
val = 1;
else
val = 0;
write(fd, &val, 4);
return
0;}
進行編譯、測試:
$ gcc -o led_test led_test.c
$ ./led_test on
$ ./led_test off
沒問題,成功操作led!
寫linux驅動程式的步驟無非是:
驅動框架
硬體操作
這裡編寫的程式和微控制器程式的區別就是:
微控制器一般不具備mmu(記憶體管理單元),使用的是實體地址,而現在的soc一般都帶有mmu,使用虛擬位址。這時候我們就需要用linux c庫提供的ioremap函式去將物理位址對映為虛擬位址。
通過檢視原理圖,我們得知led(status-led)接在pa17處。
port controller register 的物理基位址為0x01c20800,在sun8i_opizero_led.c中使用:
pacfg[0] = (volatile
unsigned
long *)ioremap(pio_base, 0x20);
把pa_cfg0、pa_cfg1、……pa_pul1這0x20位元組物理位址對映到pacfg[0]~(paccfg[0] + 8)。
之後的操作也是就跟操作微控制器一樣的位操作了。
對硬體操作封裝成固定的驅動程式框架格式,經過編譯之後就可以註冊到核心以待使用了。
linux驅動之 led驅動
練手,第乙個字元驅動.用模組載入方法 華清遠見 嵌入式linux裝置驅動開發詳解 的 拿來改的.編譯過程發現很多錯誤.最後發現 這本書帶的驅動 都是基於linux2.4的.目前我用的linux2.6,部分需要做修改.我的板子是 友善之臂的 2410.vmware ubuntu nfs交叉編譯 首先 ...
Linux驅動 LED驅動測試
環境 主機 fedora12 目標板 mini6410 目標板linux核心版本 2.6.38 實現功能 驅動目標板4個led.說明 led與6410引腳對應連線 led1 gpk4 led2 gpk5 led3 gpk6 led4 gpk7 驅動源 led driver.c cpp view pl...
linux裝置模型 (1) led裝置
乙個簡單的led驅動裝置模型demo 以三星s5pc100的n類引腳的最低一位作為乙個led燈裝置 開發環境 宿主機fedora13,交叉編譯工具arm linux gcc4.3.2 處理器 s5pc100 先建乙個工程資料夾 home led device 下放led裝置有關檔案 s5pc100 ...