第乙個linux驅動 讀寫裝置檔案(2)

2021-07-25 03:08:51 字數 4003 閱讀 5050

------在android模擬器和開發板上進行測試驅動模組

第一步新增邏輯功能部分**

1.新增建立檔案部分**,新增後的hello.c的**如下:

#include

#include

#include

#include

#include

#include

#define device_name "myfirstdriver"

//定義裝置檔案

static

struct file_operations dev_fops =

;static

struct miscdevice misc =

;//linnux驅動的裝載函式

static

int__

init hello_drive_init

(void)

//linux驅動的解除安裝函式

static

void

__exit

hello_drive_exit

(void)

//註冊裝載函式

module_init(hello_drive_init);

//註冊解除安裝函式

module_exit(hello_drive_exit);

重新編譯root@wayy-optiplex-9020:/usr/marsboard-a20-android-4.2.2-sdk-v2.0/lichee/linux-3.3/drivers/hello# make -c /usr/src/linux-headers-3.13.0-86-generic/ m=/usr/marsboard-a20-android-4.2.2-sdk-v2.0/lichee/linux-3.3/drivers/hello

解除安裝掉之前載入的和hello驅動

#rmmod hello

#insmod hello.ko

進入檔案目錄下察看檔案

#ls /dev/myfirstdriver

顯示結果如下:

/dev/myfirstdriver  證明在相關目錄下已經生成了檔案

檢視裝置號 #ls -al /dev/myfirstdriver

得到結果:crw------- 1 root root 10, 56  5月 20 15:46 /dev/myfirstdriver

2、新增實際的邏輯**:

新增後的hello.c的**如下:

#include

#include

#include

#include

#include

#include

#define device_name "myfirstdriver"

//定義裝置檔案

//儲存讀寫陣列

static

unsigned

char mem[1000];

//儲存讀寫字串的數量

static

ssize_t char_count = 0;

//處理裝置檔案讀動作

static ssize_t hello_drive_read

(struct file *file, char

__user *buf, size_t count, loff_t *ppos)

printk("read:count:%d\n",(int)count);

printk("read:char_count:%d\n",(int)char_count);

char_count = 0;

return read_count;

}//處理裝置檔案寫動作

static ssize_t hello_drive_write

(struct file *file, const

char

__user *buf,size_t count, loff_t *ppos)

mem[count] = '\0';

printk("write:char_count:%d\n",(int)char_count);

return char_count;

}static

struct file_operations dev_fops =

;static

struct miscdevice misc =

;//linnux驅動的裝載函式

static

int__

init hello_drive_init

(void)

//linux驅動的解除安裝函式

static

void

__exit

hello_drive_exit

(void)

//註冊裝載函式

module_init(hello_drive_init);

//註冊解除安裝函式

module_exit(hello_drive_exit);

重新編譯:#make -c /usr/src/linux-headers-3.13.0-86-generic/ m=/usr/marsboard-a20-android-4.2.2-sdk-v2.0/lichee/linux-3.3/drivers/hello/

解除安裝驅動:#rmmod hello

寫入內容:#echo hellooo > /dev/myfirstdriver

3.檢視效果

獲得內容:#cat /dev/myfirstdriver 

顯示內容:hellooo

檢視日誌:#dmesg

顯示結果:

[167636.665140] read:count:32768

[167636.665143] read:char_count:0

第二步匯入android模擬器進行測試

adb -s 20080411 push hello.ko /data/local1.修改核心配置

編譯核心

使用goldfish編譯hello驅動(goldfish編譯已經成功,但是呼叫emulator 命令 **zimage暫未成功)

第三步匯入android開發板進行測試

1.在解壓下的marsboard的安卓**路徑下建立hello驅動資料夾

#cd  /usr/marsboard-a20-android-4.2.2-sdk-v2.0/lichee/linux-3.3/drivers

#mkdir hello

把hello.c和makefile拷貝到hello資料夾下,命令省略。

進入/usr/marsboard-a20-android-4.2.2-sdk-v2.0/lichee/linux-3.3/drivers路徑 #cd /usr/marsboard-a20-android-4.2.2-sdk-v2.0/lichee/linux-3.3/drivers

修改makefile,在末尾新增:obj-m                += hello/     //(-m表示以模組化編譯,不編譯進核心)

進入到lichee路徑下面

#./build.sh  -p sun7i_android

編譯完成之後會在hello資料夾下生成.o和.ko格式的檔案

2.使用adb在開發板下進行測試

把開發板通過usb線連線至ubuntu電腦

新開啟乙個終端(ctrl+alt+t)

#adb devices

得到開發板的裝置號:20080411

將hello.ko傳至marsboard開發板

進入hello資料夾的路徑後# adb -s 20080411 push hello.ko /data/local

裝載hello.ko驅動

#insmod hello.ko

顯示除錯資訊

# dmesg

得到結果:

第乙個linux 驅動

以前看過很多次linux相關的資料,一直沒親自動手寫,今天通過半天努力,終於完成了乙個自己的linux小驅動 hello.c include include module license dual bsd gpl static int hello init void static void hell...

第乙個驅動之字元裝置驅動(二)mdev

mdev是busybox提供的乙個工具,用在嵌入式系統中,相當於簡化版的udev,作用是在系統啟動和熱插拔或動態載入驅動程式時,自動建立裝置節點。檔案系統中的 dev目錄下的裝置節點都是由mdev建立的。在載入驅動過程中,根據驅動程式,在 dev下自動建立裝置節點。前面的部落格實現了第乙個版本,但是...

第乙個驅動之字元裝置驅動(二)mdev

mdev是busybox提供的乙個工具,用在嵌入式系統中,相當於簡化版的udev,作用是在系統啟動和熱插拔或動態載入驅動程式時,自動建立裝置節點。檔案系統中的 dev目錄下的裝置節點都是由mdev建立的。在載入驅動過程中,根據驅動程式,在 dev下自動建立裝置節點。前面的部落格實現了第乙個版本,但是...