天天看點

測試驅動代碼步驟

裝置号:

主裝置号:用于區分不同種類的裝置。

次裝置号:區分同一類型的多個裝置。

驅動連結清單:管理所有裝置的驅動。

**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進行檢視:

測試驅動代碼步驟
測試驅動代碼步驟

繼續閱讀