4412 Linux驅動入門01

2021-09-26 07:37:29 字數 2927 閱讀 8834

作為一名嵌入式開發工程師,學習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的 結構呢?...