首頁歷史 > 正文

全志V3S開發板驅動示例(linux demo驅動開發)

2022-10-04由 程式猿李巍 發表于 歷史

1。前言

本文描述了基於全志V3S開發板的

簡單驅動程式

測試應用程式

的設計流程。我們設計的驅動程式和測試程式極其簡單,適合初學者上手學習。

軟體執行的

硬體環境

是基於V3S開發板中的全志V3S處理器,該處理器集成了一個1。2GHz工作主頻的單ARM CortexTM-A7 核,晶片內部集成了64MB DRAM 儲存器。

全志V3S開發板驅動示例(linux demo驅動開發)

軟體設計是基於

linux3.4核心

全志V3S開發板驅動示例(linux demo驅動開發)

2。設計流程概述

設計的步驟依次是:

步驟一

:編寫一個demo_driver。c的驅動程式。

步驟二

:編寫makefile檔案。

步驟三

:編寫一個demo_app。c的應用程式。

步驟四

:在V3S開發板中安裝demo_driver驅動程式,並測試demo_app應用程式。

linux系統是一個分層結構,我們設計的demo_driver位於核心中的驅動部分,demo_app位於使用者級。

全志V3S開發板驅動示例(linux demo驅動開發)

3。編寫驅動程式

編寫一個demo_driver。c的驅動程式,驅動程式原始碼如下:

/************************************************************************************************************ demo_driver* (c) Copyright 2021-2031* All Rights Reserved** @File : * @By : liwei* @Version : V0。01* ***********************************************************************************************************//**********************************************************************************************************Includes **********************************************************************************************************/#include #include #include #include /**********************************************************************************************************Define**********************************************************************************************************/#define DRIVER_MAJOR 188#define DEVICE_NAME “demo_driver”/************************************************************************************************************ @描述 : ***********************************************************************************************************/static int demo_open(struct inode *inode, struct file *file){ printk(KERN_EMERG “======================demo_open======================\n”); return 0;}/************************************************************************************************************ @描述 : ***********************************************************************************************************/static ssize_t demo_write(struct file *file, const char __user * buf, size_t count, loff_t *ppos){ printk(KERN_EMERG “======================demo_write======================\n”); return 0;}/************************************************************************************************************ @描述 : ***********************************************************************************************************/static ssize_t demo_read(struct file *file, char __user * buf, size_t count, loff_t *ppos){ printk(KERN_EMERG “======================demo_read ======================\n”); return 0;}/************************************************************************************************************ @描述 : ***********************************************************************************************************/static int demo_close(struct inode *inode, struct file *file){ printk(KERN_EMERG “======================demo_close ======================\n”); return 0;}/************************************************************************************************************ @描述 : ***********************************************************************************************************/static struct file_operations demo_flops = { 。owner = THIS_MODULE, 。open = demo_open, 。write = demo_write, 。read = demo_read, 。release = demo_close,};/************************************************************************************************************ @描述 : ***********************************************************************************************************/static int __init demo_init(void){ int ret; //註冊裝置 ret = register_chrdev(DRIVER_MAJOR,DEVICE_NAME, &demo_flops); if (ret < 0) { printk(KERN_EMERG DEVICE_NAME “ can‘t register major number。\n”); return ret; } else { printk(KERN_EMERG DEVICE_NAME “ ======================demo init======================\n”); } return 0;}/************************************************************************************************************ @描述 : ***********************************************************************************************************/static void __exit demo_exit(void){ unregister_chrdev(DRIVER_MAJOR, DEVICE_NAME); printk(KERN_EMERG DEVICE_NAME “ ======================demoexit======================\n”);}module_init(demo_init);module_exit(demo_exit);MODULE_LICENSE(“GPL”);/***********************************************END*******************************************************/

編譯驅動程式依賴linux核心原始碼環境,需要把驅動C檔案放在linux原始碼目錄中,透過編譯linux核心的方式得到驅動ko檔案。

全志V3S開發板驅動示例(linux demo驅動開發)

為了得到驅動ko,我們在easyboard/corelinux/v3ssdk/linux-3。4/drivers/char目錄下面

建立一個demo_driver的資料夾

,並把demo_driver。c程式複製到demo_driver的資料夾中。

全志V3S開發板驅動示例(linux demo驅動開發)

4。編寫makefile

我們透過編譯linux核心的方式得到驅動ko檔案,為了在編譯核心時得到相應的驅動,我們需要在linux-3。4核心程式碼中

增加和修改Makefile檔案

(Makefile的作用指定了工程編譯的方法和步驟)。

首先我們

修改easyboard/corelinux/v3ssdk/linux-3.4/drivers/char目錄下Makefile檔案

,在Makefile檔案內容最末行加入一行程式碼:

obj += demo_driver/

這句程式碼的意思是:編譯核心時,子目錄demo_driver/下的檔案也將進行編譯。

全志V3S開發板驅動示例(linux demo驅動開發)

我們在easyboard/corelinux/v3ssdk/linux-3。4/drivers/char/demo_driver中

建立一個Makefile檔案

,同時在Makefile檔案中加入一行程式碼:

obj-m += demo_driver。o

這句程式碼的意思是:編譯當前目錄中的demo_driver。c檔案,輸出一個demo_driver。ko的驅動檔案。

全志V3S開發板驅動示例(linux demo驅動開發)

準備好demo_driver。c檔案和Makefile檔案後,我們

執行編譯核心指令

。/linux_docker_build。sh

核心編譯需要等待10分鐘左右。

全志V3S開發板驅動示例(linux demo驅動開發)

經過上述一波操作,我們得到了

demo_driver.ko的驅動檔案

全志V3S開發板驅動示例(linux demo驅動開發)

到目前為止我們的程式碼設計工作

完成了50%

,如下圖所示:

全志V3S開發板驅動示例(linux demo驅動開發)

5。編寫應用程式

編寫一個demo_app。c的應用程式,程式原始碼如下:

/************************************************************************************************************ demo_driver* (c) Copyright 2021-2031* All Rights Reserved** @File : * @By : liwei* @Version : V0。01* ***********************************************************************************************************//**********************************************************************************************************Includes **********************************************************************************************************/#include #include #include #include #include #include #include /************************************************************************************************************ @描述 : ***********************************************************************************************************/int main(int arvc, char *argv[]){ int fd; int value = 0; printf(“==========demo_test==================\n”); //開啟驅動 fd = open(“/dev/demo_driver”,O_RDWR); while(1) { //執行驅動讀操作 read(fd,&value,4); sleep(1); //執行驅動寫操作 write(fd,&value,4); sleep(1); printf(“==========run==================\n”); } return 0;}/***********************************************END*******************************************************/

將應用程式原始碼放在虛擬機器的任意一個目錄中如:/home/easyboard/work/demo

然後我們在終端中進入/home/easyboard/work/demo目錄,在該目錄下執行如下

gcc編譯指令

arm-buildroot-linux-gnueabihf-gcc -o demo_app demo_app。c

於是我們得到一個

demo_app可執行檔案

全志V3S開發板驅動示例(linux demo驅動開發)

在虛擬機器中我們利用交叉編譯工具,直接編譯即可得到V3S目標板的可執行檔案。

全志V3S開發板驅動示例(linux demo驅動開發)

到目前為止我們的程式碼設計工作

完成100%

,如下圖所示:

全志V3S開發板驅動示例(linux demo驅動開發)

6。安裝驅動及執行應用程式

經過上述操作,我們得到了

demo_driver.ko和demo_app兩個文

件,我們使用SecureCRTPortable工具

將這兩個檔案傳輸到V3S開發板中

。(傳輸手段不限,用自己熟悉的方法將檔案複製到開發板中即可)

全志V3S開發板驅動示例(linux demo驅動開發)

完成檔案傳輸後,我們需要先安裝我們編譯的驅動ko檔案,然後執行測試程式,操作流程如下:

操作一

:執行安裝驅動指令:

insmod demo_driver。ko

全志V3S開發板驅動示例(linux demo驅動開發)

操作二

:執行建立檔案節點指令:

mknod /dev/demo_driver c 188 0

188的是裝置號

,我們在設計的驅動C檔案中有如下定義:

/**********************************************************************************************************Define**********************************************************************************************************/#define DRIVER_MAJOR 188#define DEVICE_NAME “demo_driver”

操作三(可選)

:執行檢視驅動裝置指令:

ls /dev

此時我們看到Linux核心中已經包含了我們驅動裝置,如下圖所示:

全志V3S開發板驅動示例(linux demo驅動開發)

操作四

:執行修改demo_app檔案許可權指令:

chmod 777 demo_app

操作五

:執行執行demo_app指令:

。/demo_app

demo_app執行結果如下:

全志V3S開發板驅動示例(linux demo驅動開發)

注意:裝置重啟後,需要重新載入驅動!

7。總結

編譯驅動程式依賴linux核心原始碼環境

,我們設計的驅動檔案放需要在linux原始碼目錄中,同時編寫Makefile檔案,最終透過編譯核心的方式得到驅動ko檔案。

全志V3S開發板驅動示例(linux demo驅動開發)

在虛擬機器中使用

交叉編譯工具

,可以編譯得到可執行檔案。

全志V3S開發板驅動示例(linux demo驅動開發)

創作不易希望朋友們點贊,轉發,評論,關注。您的點贊,轉發,評論,關注將是我持續更新的動力作者:李巍Github:liyinuoman2017CSDN:liyinuo2017今日頭條:程式猿李巍

全志V3S開發板驅動示例(linux demo驅動開發)

頂部