linux驅(qū)動(dòng)編程——第一個(gè)驅(qū)動(dòng)Helloworld
主要概念:
linux三大驅(qū)動(dòng):
????字符設(shè)備碴萧、網(wǎng)絡(luò)設(shè)備、塊設(shè)備显蝌。
驅(qū)動(dòng)是連接硬件和內(nèi)核的橋梁
驅(qū)動(dòng)編譯方式:
????驅(qū)動(dòng)編譯成模塊预伺,使用的時(shí)候使用insmod命令加載
????驅(qū)動(dòng)編譯進(jìn)內(nèi)核,設(shè)備開機(jī)即加載好了驅(qū)動(dòng)曼尊。
實(shí)驗(yàn)?zāi)康模?/h2>
????熟悉驅(qū)動(dòng)框架編寫酬诀,編譯,加載流程骆撇。
主要函數(shù)調(diào)用:
驅(qū)動(dòng)主要分為四部分:
????頭文件
????驅(qū)動(dòng)模塊的入口及出口函數(shù)
????聲明信息
????功能實(shí)現(xiàn)
#include <linux/init.h>? ? ? ? ????????//包含宏定義的頭文件
#include <linux/module.h> ? ? ? ?//包含初始化加載模塊的頭文件
module_init();? ? ? ? ? ? ? ? ? //驅(qū)動(dòng)入口
module_exit();? ? ? ? ? ? ? ? ? //驅(qū)動(dòng)出口
MODULE_LICENSE("GPL");? ? ? ? ? //聲明開源許可證
staticinthello_init(void);? ? //入口函數(shù)共嗯那個(gè)實(shí)現(xiàn)
staticvoidhello_exit(void);? //出口函數(shù)功能實(shí)現(xiàn)
代碼:
//helloworld.c
#include <linux/init.h>
#include <linux/module.h>
static int hello_init(void)
{
? ? printk("hello, world!\r\n");
? ? return0;
}
static void hello_exit(void)
{
? ? printk("byebye!\r\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("SIXER"); //聲明作者信息
注意:
Linux驅(qū)動(dòng)是屬于內(nèi)核部分的瞒御,其打印是通過 printk 函數(shù),而不是 printf 函數(shù)神郊。
編譯運(yùn)行:
這里我們編寫了一個(gè) Makefile葵腹,方便我們的編譯高每。
Makefile
KERNELDIR := /home/sixer/imx_kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga
CURRENT_PATH :=$(shell pwd)
exportARCH=arm
exportCROSS_COMPILE=arm-linux-gnueabihf-
target := helloworld
obj-m :=$(target).o
APP_NAME :=$(target)_app
build:kernel_modules
kernel_modules:
? ? $(MAKE)-C$(KERNELDIR)M=$(CURRENT_PATH)modules
clean:
? ? $(MAKE)-C$(KERNELDIR)M=$(CURRENT_PATH)clean
dir_exist =$(shell if [ -d "/nfsroot/$(target)/" ]; then echo "exist"; else echo "noexist"; fi)
$(info $(dir_exist))
install:
ifeq ("$(dir_exist)", "noexist")
? ? $(shell mkdir /nfsroot/$(target))
? ? #"文件夾不存在,已重新創(chuàng)建文件夾"
endif
? ? cp*.ko? /nfsroot/$(target)/
回到Makefile目錄践宴,使用如下命令
make 將 helloworld 將 .c 編譯成驅(qū)動(dòng)模塊 helloworld.ko
make install 這里我使用這個(gè)命令拷貝目標(biāo)文件到我搭建的 nfs 目錄下鲸匿。
不熟悉nfs的話可以通過其他途徑拷貝編譯的目標(biāo)文件 helloworld.ko 到開發(fā)板。
Makefile注意事項(xiàng):
KERNELDIR 為內(nèi)核源碼目錄阻肩,驅(qū)動(dòng)編譯的過程中需要使用一些內(nèi)核源碼带欢,所以這個(gè)目錄必須準(zhǔn)確指定為我們開發(fā)板使用系統(tǒng)內(nèi)核對(duì)應(yīng)的內(nèi)核源碼目錄。
必須指定 arm 架構(gòu)及交叉編譯器 arm-linux-gnueabihf-烤惊。
install 為方便目標(biāo)文件拷貝編寫的乔煞。
實(shí)驗(yàn)現(xiàn)象:
[root@iTOP-iMX6UL]# cd /mnt/nsf_dir/
[root@iTOP-iMX6UL]# ls
02gpioled ? chartest ?? demo.c ? ?? helloworld? misc.c ? ?? pipe1.c
[root@iTOP-iMX6UL]# cd helloworld/
[root@iTOP-iMX6UL]# ls
helloworld.ko
[root@iTOP-iMX6UL]# insmod helloworld.ko
hello, world!
[root@iTOP-iMX6UL]# rmmod helloworld.ko
byebye!
[root@iTOP-iMX6UL]#
總結(jié):
通過一個(gè) helloworld 的驅(qū)動(dòng)實(shí)現(xiàn),可見柒室,驅(qū)動(dòng)的基本框架真的是很容易掌握的渡贾。所以,驅(qū)動(dòng)開發(fā)的知識(shí)雄右,只是多空骚,而不是復(fù)雜,學(xué)習(xí)的時(shí)候一定要多花笨功夫擂仍。
公眾號(hào):InsertingAll