first_drv.c:
makefile:#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);
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...