裝置号:
主裝置号:用于區分不同種類的裝置。
次裝置号:區分同一類型的多個裝置。
驅動連結清單:管理所有裝置的驅動。
**1.添加:**編寫完驅動程式加載到核心。
1.1裝置号。
1.2裝置号。
1.3裝置驅動函數(操作寄存器來驅動IO口)
**2.查找:**調用驅動程式,使用者空間去open
驅動插傳入連結表的順序由裝置号檢索。
驅動代碼基本架構:
加入static是由于linux核心源代碼量龐大容易與其他指令重名,是以需要讓這些指令隻在目前檔案有效
#include <linux/device.h> //class devise聲明
#include <linux/uaccess.h> //copy_from_user 的頭檔案
#include <linux/types.h> //裝置号 dev_t 類型聲明
#include <asm/io.h> //ioremap iounmap的頭檔案
static struct class *pin4_class;
static struct device *pin4_class_dev;
static dev_t devno; //裝置号
static int major =231; //主裝置号
static int minor =0; //次裝置号
static char *module_name="pin4"; //子產品名
//led_open函數
static int pin4_open(struct inode *inode,struct file *file)
{
printk("pin4_open\n"); //核心的列印函數和printf類似
return 0;
}
//led_write函數
static ssize_t pin4_write(struct file *file,const char __user *buf,size_t count, loff_t *ppos)
{
printk90("pin4_write\n");
return 0;
}
static struct file_operations pin4_fops = {
.owner = THIS_MODULE,
.open = pin4_open,
.write = pin4_write,
};
int __init pin4_drv_init(void) //真實驅動入口
{
int ret;
devno = MKDEV(major,minor); //建立裝置号
ret = register_chrdev(major, module_name,&pin4_fops); //注冊驅動 告訴核心,把這個驅動加入到核心驅動的連結清單中
pin4_class=class_create(THIS_MODULE,"myfirstdemo"); //讓代碼在dev下自動生成裝置(如果用手動生成裝置較麻煩指令為:sudo mknod 名字 類型(通常為c字元串裝置) 主裝置号 次裝置号)
pin4_class_dev =device_create(pin4_class,NULL,devno,NULL,module_name); //建立裝置檔案
return 0;
}
void __exit pin4_drv_exit(void)
{
device_destroy(pin4_class,devno); //銷毀裝置
class_destroy(pin4_class); //銷毀類
unregister_chrdev(major, module_name); //解除安裝驅動
}
module_init(pin4_drv_init); //入口 核心加載該驅動時,這個宏會被調用
module_exit(pin4_drv_exit);
MODULE_LICENSE("GPL v2");
在編譯驅動代碼前需要配置Linux核心源碼中字元串裝置裡面的Makefile,添加obj-m +=pin4driver2.o. (驅動代碼不一定非得放在對應的裝置驅動檔案夾下,可以任意放置,但是需要修改對應檔案下加的makefile,使之變異之後生成對應的.ko檔案)
路徑:
源碼樹目錄下的字元驅動裝置路徑。
添加配置
編譯
使用核心編譯指令進行編譯(在核心源碼的目錄下進行編譯):
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make modules
會生成pin4driver2.ko的檔案。
使用交叉編譯工具對上層代碼進行編譯:
上層代碼:
編譯上層代碼:
複制上層代碼和驅動到樹莓派scp 檔案 [email protected]:/home/pi
樹莓派加載驅動代碼:
sudo insmod pin4_drive2.ko 将驅動加載到驅動連結清單中去。
檢視是否生成裝置檔案:ls /dev/pin4 -l
列出核心驅動子產品:ls mod
删除驅動:sudo rmmod 加子產品名不用加.ko字尾
還需要更改裝置檔案的類型:
sudo chmod 666 /dev/pin4
運作上層代碼:
驅動代碼中函數裡面的printk是在核心中列印是以在指令界面沒有列印,可以使用dmesg進行檢視: