作為一名嵌入式開發工程師,學習linux是必要的。當初我在校培訓linux s3c2410開發板,結論:迷迷糊糊。所以打算從「根」上去學習,結果走上了微控制器-》智慧型家居的路上。幸好目前有幸接觸linux開發專案。從頭把linux在搞一遍,成為一名合格的嵌入式開發工程師。
今天要使用的板子是4412,談下為什麼使用這個板子,網上對於很多學習linux的開發板,大多是關於s3c2410,等等。然而當時買的開發板是韋哥的最牛板子4412學習安卓framework準備的,目前工作不需要安卓,因此使用4412作為入門學習。
#include #define gpbcon (*(volatile unsigned long *)0x110002e0)
#define gpbdat (*(volatile unsigned long *)0x110002e4)
#define gpb0_out (1<
#define gpb1_out (1<
#define gpb2_out (1<
#define gpb3_out (1<
void wait(volatile unsigned long dly)
int main(void)
*/ return 0;
}
上班沒時間搞這些,週末加班繼續幹。
接下來呢,搞驅動把。乙個完整的測試驅動分為3部分,1.是驅動原始碼。2.驅動對應makefile。3.測試驅動的應用程式。
1.首先是驅動原始碼的編寫
第一步驅動框架的搭建
#include #include #include #include #include #include #include #include #include #include static struct class *firstdrv_class;
static struct class_device *firstdrv_class_dev;
volatile unsigned long *gpfcon = null;
volatile unsigned long *gpfdat = null;
static int gaoyuan_open(struct inode *inode, struct file *file)
static int gaoyuan_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
static struct file_operations gaoyuan_led_dev_fops = ;
int major;
static int __init gaoyuan_led_init(void)
static void __exit gaoyuan_led_exit(void)
module_init(gaoyuan_led_init);
module_exit(gaoyuan_led_exit);
module_license("gpl");
module_author("gaoyuan publish");
在測試的過程當中,每次rsmmod都失敗,在多個群裡傳送問題,有冷嘲熱諷的說是自己去看api等等,但是無論在**都有熱心人,通過群裡了解到,我使用的銷毀函式有問題,這裡我要多說一句,既然核心版本不同,api不同為什麼老版本的api你卻可以編譯過去,純純的誤導。
熱心人鏈結解決辦法
通過以上方法以後,驅動框架搭建已經完成。
接下來如何點燈。
框架搭建完成以後任務就簡單了
static int gaoyuan_open(struct inode *inode, struct file *file)
static int gaoyuan_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
else
return 0;
}
只需要替換open 和write
在init函式中加入上面說說的位址對映
gpfcon = (volatile unsigned long *)ioremap(0x110002e0, 16); // 對映位址,在系統中是不允許直接操作實體地址的,必須重對映位址,後面的引數是大小的意思
gpfdat = gpfcon + 1;
第二部分是寫makefile
隨便貼上複製過來就可以了,如下
ifeq ($(kernelrelease),)
pwd = $(shell pwd)
#kernel_dir = /home/yuan/linux/linux-3.16.2
kernel_dir = /root/linux-3.5
modules:
make -c $(kernel_dir) m=$(pwd) modules
clean:
make -c $(kernel_dir) m=$(pwd) clean
else
endif
第三步就是最後測試的應用程式了
#include #include #include #include /*
*/int main(int argc, char **ar**)
if (argc != 2)
if (strcmp(ar**[1], "on") == 0)
else
write(fd, &val, 4);
return 0;
}
應用程式是不是很熟悉0.0,沒錯就是韋哥寫的程式。哈哈。
最後說下做應用也是要多少了解驅動的。0.0.後續再聊
tiny4412 Linux驅動開發之輸入子系統
本次介紹linux的輸入子系統的驅動開發.linux 核心的輸入子系統為滑鼠 鍵盤 觸控螢幕 遊戲杆等輸入裝置提供了驅動框架。當程式設計師要為自己的輸入裝置編寫驅動程式時,只需要實現從裝置獲取輸入事件即可。至於 輸入事件如何處理,使用者介面如何實現,都由輸入子系統完成。這大大減輕了輸入驅動程式 的編...
Linux驅動入門
核心版本 2.4.22 閱讀此文的目的 學會編寫linux裝置驅動。閱讀此文的方法 閱讀以下2個檔案 hello.c,asdf.c。此文假設讀者 已經能用c語言編寫linux應用程式,理解 字元裝置檔案,塊裝置檔案,主裝置號,次裝置號 會寫簡單的shell指令碼和makefile。1.hello.c...
linux驅動編寫(usb host驅動入門)
usb協議是乙個複雜的協議,目前涉及到的版本就有usb1.0,usb2.0,usb3.0。大家如果開啟kernel usb host目錄,就會發現下面包含了ohci,uhci,ehci,xhci,whci等多種形式的控制器驅動。那麼,對於我們這些不是很了解usb的開發人員,如何了解usb的 結構呢?...