韋東山第12課 字元裝置驅動框架 led驅動

2021-08-07 19:11:56 字數 4794 閱讀 5157

first_drv.c:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include static int first_drv_open(struct inode *inode, struct file *file)

static ssize_t first_drv_open(struct file *file, const char __user *buf, size_t count, loff_t *ppos);

static const struct file_operations first_drv_fops = ;

static int __init first_drv_init(void)

static void __exit first_drv_exit(void)

module_init(first_drv_init);

module_exit(first_drv_exit);

module_license("gpl");

module_alias_chardev_major(ibm_fs3270_major);

makefile:

kern_dir = /home/book/workspace/jz2440/systems/linux-2.6.22.6

all:

make -c $(kern_dir) m='pwd' modules

clean:

make -c $(kern_dir) m='pwd' module clean

rm -rf modules.order

obj-m += first_drv.o

載入驅動:

cat /proc/devices   //檢視驅動

insmod sht21.ko//裝置驅動 呼叫

module_init(first_drv_init);

rmmod first_drv //解除安裝驅動呼叫

module_exit(first_drv_init);

lsmod //檢視核心中已經載入了哪些模組

mknod /dev/led c 111 0 // 建立裝置檔案

int major=register_chrdev(0,"first_drv",&first_drv_fops); //填0表示自動分配裝置號

udev機制,我們就是mdev,

cd /sys/ 目錄下有系統裝置的資訊

mdev根據系統資訊建立裝置節點。

在驅動註冊函式中加入如下**:

firstdrv_class = class_create(this_module, "firstdrv");

firstdrv_class_dev = class_device_create(firstdrv_class, null, mkdev(major, 0), null, "xyz"); /* /dev/xyz */

在驅動解除安裝函式中加入如下**:

class_device_unregister(firstdrv_class_dev);class_destroy(firstdrv_class);

這個時候驅動載入進去就會自動建立裝置檔案。

問:為什麼可以自動建立呢:

答:驅動程式通過這兩個函式,給核心提供了系統資訊。一載入就會有檔案生成 /sys/class/firstdrv/xyz/dev   mdev根據這些資訊建立裝置。

問:為什麼mdev機制可以根據/sys目錄檔案的改變生成檔案呢?

答:/etc/init.d/rcs 中有「echo /sbin/mdev > /proc/sys/kernel/hotplug」 表示支援熱插拔:有驅動載入,就呼叫mdev

我的系統竟然不支援熱插拔,

1 構建根檔案系統時busybox 配置為支援hotplug

2 /etc/init.d/rcs 中加入「echo /sbin/mdev > /proc/sys/kernel/hotplug」等

程式框架:

//first_drv.c:

#include #include #include #include #include #include #include #include #include #include static struct class *firstdrv_class;

static struct class_device *firstdrv_class_dev;

static int first_drv_open(struct inode *inode, struct file *file)

static ssize_t first_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)

static struct file_operations first_drv_fops = ;

int major;

static int __init first_drv_init(void)

static void first_drv_exit(void)

module_init(first_drv_init);

module_exit(first_drv_exit);

module_license("gpl");

#include #include #include #include #include #include #include #include #include #include static struct class *firstdrv_class;

static struct class_device *firstdrv_class_dev;

volatile unsigned long *gpfcon = null;

volatile unsigned long *gpfdat = null;

static int first_drv_open(struct inode *inode, struct file *file)

static ssize_t first_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)

else

//printk("first_drv_write\n");

return 0;

}static struct file_operations first_drv_fops = ;

int major;

static int __init first_drv_init(void)

static void first_drv_exit(void)

module_init(first_drv_init);

module_exit(first_drv_exit);

module_license("gpl");

copy_from_user

static inline int copy_from_user(void *to, const void __user *from, int n)

例子:.ko/first_drv_write:copy_from_user(&val, buf, count);  //從buf考值到val中

測試程式用write寫資料到驅動first_drv_write

copy_to_user

static inline int copy_to_user(void __user *to, const void *from, int n)

例子:.ko/second_drv_read:copy_to_user(buf, key_vals, sizeof(key_vals)); //將key_cals的值考入buf中

seconddrvtest.c:read(fd, key_vals, sizeof(key_vals));

firstdrvtest.c

firstdrvtest.c:  //通過操作檔案/dev/led  使用驅動,open write與驅動中的對應

昨天編譯一直不能用是因為用的gcc 編譯的 應該用arm-linux-gcc -o firstdrvtest firstdrvtest.c

#include #include #include #include /* firstdrvtest on

* firstdrvtest off

*/int main(int argc, char **argv)

if (argc != 2)

if (strcmp(argv[1], "on") == 0)

else

write(fd, &val, 4);

return 0;

}

韋東山匯流排驅動裝置模型201128

一,bus drv dev模型 新一期 一 bus,device,driver都是乙個結構體。二 這只是一種機制,一種device和driver建立聯絡的機制。三 註冊 1,driver register,會把driver註冊到bus結構體中的drv煉表裡。2,device add,會把device...

字元裝置驅動框架

字元裝置驅動框架 一 linux軟體系統的層次關係 乙個應用程式操作底層驅動程式的過程 1 應用程式使用庫提供的 open函式開啟某乙個裝置檔案。2.庫根據 open函式傳入的引數執行 swi 軟體中斷 指令,這會引起 cpu異常,進入核心。3 核心的異常處理函式根據這些引數找到相應的驅動程式,返回...

字元裝置驅動框架

標頭檔案 linux cdev.h linux fs.h 描述字元裝置共性資訊的結構體 struct cdev 操作方法集 struct file operations 裝置號,本質是32位無符號整型數 dev t dev 該裝置號由兩部分組成,1.主裝置號 2.次裝置號 major dev t d...