若該文為原創文章,轉載請注明原文出處。
報著學習態度,接下來學習驅動是如何使用的,從簡單的helloworld驅動學習起。
開始編寫第一個驅動程序—helloworld 驅動。
一、環境
1、開發板:正點原子的ATK-DLRK3568
2、系統: buildroot
3、內核:正點原子提供的虛擬機和rk3568_linux_sdk
二、驅動的基本框架
Linux 驅動的基本框架主要由模塊加載函數,模塊卸載函數,模塊許可證聲明,模塊參數, 模塊導出符號,模塊作者信息等幾部分組成,其中模塊參數,模塊導出符號,模塊作者信息是 可選的部分,也就是可要可不要。剩余部分是必須有的。
1. 模塊加載函數
當使用加載驅動模塊時,內核會執行模塊加載函數,完成模塊加載函數中的初始化工作。
2.模塊卸載函數
當卸載某模塊時,內核會執行模塊卸載函數,完成模塊卸載函數中的退出工作。
3.模塊許可證聲明
許可證聲明描述了內核模塊的許可權限,如果不聲明模塊許可,模塊在加載的時候,會收到“內核被污染(kernel tainted)”的警告。可接受的內核模塊聲明許可包括“GPL”“GPL v2”。
4.模塊參數(可選擇)
模塊參數是模塊被加載的時候可以傳遞給它的值。
5.模塊導出符號(可選擇)
內核模塊可以導出的符號,如果導出,其他模塊可以使用本模塊中的變量或函數。
6.模塊作者信息等說明(可選擇)
三、helloworld 驅動代碼
#include <linux/module.h>
#include <linux/kernel.h>static int __init helloworld_init(void) //驅動入口函數
{printk(KERN_EMERG "helloworld_init\r\n");//注意:內核打印用 printk 而不是 printfreturn 0;
}static void __exit helloworld_exit(void) //驅動出口函數
{printk(KERN_EMERG "helloworld_exit\r\n");
}module_init(helloworld_init); //注冊入口函數module_exit(helloworld_exit); //注冊出口函數MODULE_LICENSE("GPL v2"); //同意 GPL 開源協議MODULE_AUTHOR("yifeng"); //作者信息
根據驅動的基本框架,編寫了最簡單的helloworld程序,加載驅動和卸載驅動時直接打印信息。
編譯驅動需要內核代碼,環境自行編譯。
根據正點原子的手冊編譯需要設置環境變量,這里直接填寫到makefile里
makefile:
# 內核目錄
KERNELDIR := /home/alientek/rk3568_linux_sdk/kernel
# rk3568是arm64架構
ARCH=arm64
# 交叉工具鏈
CROSS_COMPILE=/opt/atk-dlrk356x-toolchain/usr/bin/aarch64-buildroot-linux-gnu-
export ARCH CROSS_COMPILECURRENT_PATH := $(shell pwd)
obj-m := helloworld.obuild: kernel_moduleskernel_modules:$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules
clean:$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean
直接make會生成helloworld.ko文件 ,這就是編譯生成的內核驅動模塊
四、測試
啟動開發板,把生成的helloworld.ko文件拷貝到板子上。
加載ko文件
insmod helloworld.ko
查看當前加載的內核模塊
lsmod
查看當前系統中有沒有 helloworld這個設備
cat /proc/devices
結果查詢不到,因為沒注冊。
卸載驅動模塊
rmmod helloworld.ko
這個模塊是最基礎的模板,下面大部分驅動都以此模板編寫。
如有侵權,或需要完整代碼,請及時聯系博主。