乙個驅動程式對應多個裝置

2021-08-18 02:02:21 字數 3957 閱讀 9274

目錄(?)[+]

1. 對於驅動程式中有兩個關鍵的結構體:

struct file *filp:

有乙個關鍵的成員 -> void *private_data,用於存放用於私人的資料

inode:

有乙個關鍵的成員 -> unsigned int i_flags

乙個驅動多個裝置的程式思路:

1個驅動程式,

1個struct file_operations 結構體

2個使用者結構體資料(包含 struct cdev 結構體)

在 struct file_operation 結構體的 open 方法中根據 inode 結構體中的 i_cdev 成員找到 包含 cdev 的整個結構體,從而能在read/write中能夠操作這個結構體的其他成員,具體如下:

在 open 中 將得到的 cdev 通過 struct file 結構體中的private_data 傳遞給 read/write 方法:

filp->private_data = dev;

當然裝置號和裝置節點都是兩個,通過訪問不同的 /dev 下的裝置,訪問不同的使用者資料

程式:

char_multi_dev.c

[cpp] view plain copy

#include

#include

#include

#include

#include

#include

#include

module_license ("gpl");

int hello_major = 250;

int hello_minor = 0;

int number_of_devices = 2;

struct

class *my_class;

struct hello_device

hello_device[2];

static

int hello_open (struct inode *inode, struct file *filp)

static

int hello_release (struct inode *inode, struct file *filp)

ssize_t hello_read (struct file *filp, char *buff, size_t count, loff_t *offp)

else

return result;

} /*

*ssize_t hello_write (struct file *filp, const char *buf, size_t count,

* loff_t *f_pos)

* * else

* * return ret;

*} */struct file_operations hello_fops = ;

static

void char_reg_setup_cdev (struct cdev *cdev, dev_t devno)

static

int __init hello_2_init (void)

my_class = class_create(this_module,"multi_dev_class");

if(is_err(my_class))

device_create(my_class,null, devno, null, "multi_dev0");

device_create(my_class,null, devno + 1, null, "multi_dev1");

char_reg_setup_cdev (&hello_device[0].cdev, devno);

char_reg_setup_cdev (&hello_device[1].cdev, devno+1);

printk (kern_info "char device registered\n");

strcpy(hello_device[0].data, "0000000000000000000");

strcpy(hello_device[1].data, "1111111111111111111");

return

0;

} static

void __exit hello_2_exit (void)

module_init (hello_2_init);

module_exit (hello_2_exit);

關鍵點是 96行 和 98行

對 container_of 函式的理解請看:

makefile

[python] view plain copy

ifeq ($(kernelrelease),)

kerneldir ?= /lib/modules/$(shell uname -r)/build

#kerneldir ?= ~/wor_lip/linux-3.4.112

pwd := $(shell pwd)

modules:

$(make) -c $(kerneldir) m=$(pwd) modules

modules_install:

$(make) -c $(kerneldir) m=$(pwd) modules_install

clean:

rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions modules* module*

.phony: modules modules_install clean

else

obj-m := char_multi_dev.o

endif

test.c

[cpp] view plain copy

#include

#include

#include

#include

#include

#include

int main (void)

if ((fd2 = open ("/dev/multi_dev1",o_rdonly)) < 0)

read(fd1, buf, 64);

printf("read from device0 : %s\n", buf);

read(fd2, buf, 64);

printf("read from device1 : %s\n", buf);

return

0;

} 結果:

>sudo insmod char_multi_dev.ko

>sudo ./a.out

read from device0 : 0000000000000000000

read from device1 : 1111111111111111111

>sudo rmmod char_multi_dev

>dmesg

[11074.012373] char device registered

[11087.349961] hey! device opened

[11087.349965] hey! device opened

[11087.349967] wrote 64 bytes

[11087.350021] wrote 64 bytes

[11087.350055] hmmm... device closed

[11087.350057] hmmm... device closed

[11115.543117] char device exited

linux裝置驅動程式 字元裝置驅動程式

先留個 有一起學習驅動程式的加qq295699450 字元裝置驅動 這篇比較惱火。載入成功,但是讀不出來資料,有知道怎麼回事的,留個言,一起討論下 資料結構 struct scull mem struct scull dev dev 整個驅動程式 如下 include include include...

Linux裝置驅動程式 字元裝置驅動程式

1.檢視主裝置號,次裝置號 進入 dev目錄執行ls l,第四,五列分別為主次裝置號,10,180,1,5,這些是主裝置號,而60,63這些就是次裝置號 130 shell android dev ls l crw rw r system radio 10,60 1969 12 31 21 00 a...

裝置驅動程式

首先要問,什麼是裝置驅動程式?又名裝置處理程式,是i o系統的高層與裝置控制器之間的通訊程式 起乙個翻譯的作用 這個東西能幹什麼?簡要來說就是啟動指定裝置,完成上層指定的i o工作 裝置驅動程式的特點 略,書上193頁有 裝置處理方式 為每一類裝置設定乙個程序,專門用於執行這類裝置的i o操作 一對...