linux版本 ubuntu12.04lts
//驅動部分
#include
#include
#include
#include
#include
#include
#include
#include
#include
module_license("dual bsd/gpl");
static struct hello_dev;
struct hello_dev *hello =null;
static int hello_open(struct inode *inode, struct file *file)
static int hello_close(struct inode *inode, struct file *file)
static long hello_ioctl(struct file *file,unsigned int cmd, unsigned long arg)
}return 0;
}static struct file_operations dev_fops = ;
static int hello_init(void)
hello = kmalloc(sizeof(struct hello_dev),gfp_kernel);
memset(hello,0,sizeof(struct hello_dev));
hello->devno = devno;
cdev_init(&hello->cdev,&dev_fops);//把獲得的裝置號與驅動的方法關聯起來
hello->cdev.owner = this_module;
ret =cdev_add(&hello->cdev,devno,1);//這句我的理解是,把裝置號與驅動方法關聯到核心中
if(ret)
printk(kern_alert "hello, world\n");
return 0;
}static void hello_exit(void)
unregister_chrdev_region(devno,1);
printk(kern_alert "goodbye, cruel world\n");
}module_init(hello_init);
module_exit(hello_exit);
下面是除錯**:就是除錯一下驅動寫的方法有沒有實現。
#include
#include
#include
#include
#include
#include
#include
#define text 2
int main()
printf("open success\n");
j=1;
retval=ioctl(fd,j,0);
if(retval==-1)
printf("send command1 successfully\n");
retval=ioctl(fd,2,0);
if(retval==-1)
printf("send command2 successfully\n");
close(fd);
}在本機除錯,驅動的makefile如下:
ifneq ($(kernelrelease),)
obj-m += char_hello.o //這個與你的檔名有關
else
kernel_dir ?= /lib/modules/$(shell uname -r)/build
pwd := $(shell pwd)
default:
$(make) -c $(kdir) subdirs=$(pwd) modules
clean:
$(make) -c $(kernel_dir) m=$(pwd) clean
endif
載入驅動,首先要編譯生成.ko檔案
insmod char_hello.ko
通過lsmod就能看到載入了核心 或者 dmesg | tail -10可以看到載入了驅動中_init函式printk的資訊
然後用mknod -m 0666(許可權) /dev/hello c 235 0 //c代表字元裝置 235 是主裝置號,0是此裝置號 這裡我用了靜態指定裝置號,如果用動態的話,就先在終端執行cat /proc/devices檢視
刪除驅動就用rmmod char_hello
測試程式直接用gcc編譯執行就行了。
編者在學習期間遇到乙個奇怪的問題,在pc機測試過程中,驅動中的ioctl函式裡面,當驅動收到cmd=2的話,是不會進入函式體的,終端會顯示位址錯誤的提示,編者更改測試程式中傳的值,嘗試過10個左右不同的數字,除了「2」,其他都是正常的。編者忽略這個問題,直接把**移植到開發板上。發覺絲毫沒有問題。
我和我的小夥伴都驚呆了。
這問題,編者一直沒想出個所以然。
驅動 linux裝置驅動 字元裝置驅動開發
preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...
Linux裝置驅動之《字元裝置驅動》
linux裝置中最大的特點就是裝置操作猶如檔案操作一般,在應用層看來,硬體裝置只是乙個裝置檔案。應用程式可以像操作檔案一樣對硬體裝置進行操作,如open close read write 等。下面是乙個字元裝置驅動程式的簡單實現test.c 模組分析 1.初始化裝置驅動的結構體 struct fil...
Linux裝置驅動之字元裝置驅動
一 linux裝置的分類 linux系統將裝置分成三種基本型別,每個模組通常實現為其中某一類 字元模組 塊模組或網路模組。這三種型別有 字元裝置 字元裝置是個能夠像位元組流 類似檔案 一樣被訪問的裝置,由字元裝置驅動程式來實現這種特性。字元裝置可以通過檔案系統節點來訪問,比如 dev tty1等。這...