很久以前搞的東西,現在寫一下,當儲存一下。
先是驅動檔案led_drv.c
#include#include#include#include#include#include#include #include#define gpio5_oe 0x49056034
volatile unsigned long *gpio5_oe = null;
volatile unsigned long *gpio5_datain = null;
volatile unsigned long *gpio5_dataout = null;
int major;
static struct class *myclass;
static int myled_open(struct inode *inode, struct file *file)
static ssize_t myled_read(struct file *file, char __user *buf,
size_t count, loff_t * ppos)
static ssize_t myled_write(struct file *file, const char __user *buf,
size_t count, loff_t * ppos)
else
return 0; }
static const struct file_operations myled_fops =
;static int __init myled_init(void)
static void __exit myled_cleanup (void)
module_init(myled_init);
module_exit(myled_cleanup);
module_license("gpl");
makefile 生成模組
kernel_dir = /home/tenyee/omap_prj/psp/linux-2.6.37-psp04.02.00.07.sdk
pwd := $(shell pwd)
all:
make -c $(kernel_dir) m=$(pwd) modules
obj-m := first_drv.o
clean:
rm -rf ./*o*
執行命令:insmod first_drv.ko
就把模組裝到系統中了!
這裡提一下,對於裸機微控制器,也有操作io,而且很簡單,而在這裡,其實也很簡單。微控制器與作業系統進行io操作有什麼不一樣?記住下面一點:
微控制器是直接操作實體地址的,而系統是操作虛擬位址的,所以,如果你想通過系統來操作乙個實體地址,那就得先把物理位址對映到系統的虛擬位址中去,很簡單,乙個函式就好:iomap(),然後你操作返回的位址就相當於操作實體地址了,這一部分和微控制器就是一樣的了!!!!!
測試檔案:
//#include#include#include#include#include/*
usage:
./first_drv */
int main(int argc,char *argv)
printf("open succeed\n");
if (argc != 2)
if (0 == strcmp(argv[1],"on"))
val = 1;
else
val = 0;
write(fd, &val, sizeof(val));
close(fd);
return 0;
}
編譯:arm-none-linux-gnueabi-gcc -static -o main main.c
驅動開發3 簡單的led驅動
一 字元裝置驅動框架 字元裝置驅動的編寫主要就是驅動對應的open close read。其實就是file operations結構體的成員變數的實現。二 驅動模組的載入與解除安裝 1 linux驅動程式有兩種存在形式 編譯到kernel裡面,也就是zimage 編譯為模組,ko。tip 1 編譯驅...
Linux驅動開發 LED流水燈驅動示例
include include include include include include include include include include include include include include define device name flowled define led ...
linux驅動之 led驅動
練手,第乙個字元驅動.用模組載入方法 華清遠見 嵌入式linux裝置驅動開發詳解 的 拿來改的.編譯過程發現很多錯誤.最後發現 這本書帶的驅動 都是基於linux2.4的.目前我用的linux2.6,部分需要做修改.我的板子是 友善之臂的 2410.vmware ubuntu nfs交叉編譯 首先 ...