linux驅動裝置號的註冊

2021-07-06 03:40:13 字數 2403 閱讀 3339

建立裝置號,分2種,靜態註冊和動態註冊(不是自己指定裝置號)。

靜態:註冊

int register_chrdev(unsigned int major, const char *name,const struct file_operations *fops)

傳參:major: 主裝置號

name: 裝置名

fops:指向驅動操作方法

返回值:

0:成功

非0:失敗

登出:void unregister_chrdev(unsigned int major, const char *name)

#include #include #include int led_open(struct inode *inode,struct file *file)

int led_close(struct inode *inode,struct file *file)

struct file_operations led_fops=;

int __init led_init()

return 0;

}void __exit led_exit()

module_init(led_init);

module_exit(led_exit);

module_license("ledxx");

module_author("xx");

module_description("xx test");

動態:第一步:

int alloc_chrdev_region(dev_t * dev, unsigned baseminor, unsigned count, const char * name)

第二步:

cdev_alloc(void)// 分配乙個cdev的記憶體

cdev_init(struct cdev * cdev, const struct file_operations * fops)// 分配乙個cdev的記憶體

cdev_add(struct cdev * p, dev_t dev, unsigned count)

#include #include #include #include static dev_t dev_num=0;

static struct cdev *cdev_p;

int led_open(struct inode *inode,struct file *file)

int led_close(struct inode *inode,struct file *file)

struct file_operations led_fops=;

int __init led_init()

printk("dev num=%d ; major = %d ; minor = %d ;",dev_num,major(dev_num),minor(dev_num));

cdev_p = cdev_alloc();

cdev_init(cdev_p,&led_fops);

ret = cdev_add( cdev_p,dev_num,1 );

if (ret)

return 0;

}void __exit led_exit()

module_init(led_init);

module_exit(led_exit);

module_license("ledxx");

module_author("xx");

module_description("xx test");

#include #include #include #include int main()

sleep(3);

close(fd);//關閉裝置,測試驅動的led_close函式

return 0;

}

makefile

obj-m += led.o 

kernel_dir := /home/s5pv210/android-kernel-samsung-dev

#cc = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-gcc

all:

make modules -c $(kernel_dir) m=`pwd`

clean:

make modules clean -c $(kernel_dir) m=`pwd`

說明:

1、insmod載入驅動模組和一些初始化,不會執行led_open和led_close,當應用程式對這個驅動開啟和關閉的時候,就會通過led_fops結構體呼叫響應的函式。

3、動態函式,參考:

裝置驅動及Linux裝置號

在乙個計算機系統的開發過程中,應用層一般不會去關心底層硬體的具體操作,而是專注於應用層業務邏輯的實現,因此我們會將涉及到裝置硬體底層的操作封裝成乙個個介面,應用層在進行業務設計的過程中只需呼叫這些介面便可以完成想要的操作,這些介面我們可以成為裝置驅動。即使在乙個不執行作業系統的系統中 如傳統的51微...

linux匯流排,裝置,驅動註冊

遵守udev裝置模型,首先註冊匯流排,然後是匯流排裝置,之後是具體裝置註冊,註冊完之後就可以在sys bus相應的目錄下面找到掛載這個匯流排上的裝置,最後是註冊驅動,驅動會查詢匯流排上的裝置進行繫結。比如 自定義乙個裝置是my vir device,使用匯流排是vir bus。1.註冊匯流排型別 s...

Linux核心裝置驅動註冊

platform device與platform driver 引入devicetree後改變 platform device會由kernel自動展開,呼叫of platform bus probe null,of bus ids,null 即可自動展開所有的platform device 引入de...