linux字元裝置驅動helloword

2021-06-20 17:57:42 字數 2532 閱讀 7775



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等。這...