Linux驅動開發之字元裝置驅動例項

2021-08-21 00:21:15 字數 2561 閱讀 9820

1、驅動標頭檔案mem_dev.h

#ifndef _memdev_h_

#define _memdev_h_

#ifndef memdev_major

#define memdev_major 238   /*預設的mem的主裝置號*/

#endif

#ifndef memdev_nr_devs

#define memdev_nr_devs 2    /*裝置數*/

#endif

#ifndef memdev_size

#define memdev_size 4096

#endif

/*mem裝置描述結構體*/

struct mem_dev ;

#endif /* _memdev_h_ */

2、驅動源**

filp->f_pos = newpos;

return newpos;

}/*檔案操作結構體*/

static const struct file_operations mem_fops =

;/*裝置驅動模組載入函式*/

static __init int memdev_init(void)

if (result < 0)

return result;

/*初始化cdev結構*/

cdev_init(&cdev, &mem_fops);

cdev.owner = this_module;

cdev.ops = &mem_fops;

/* 註冊字元裝置 */

cdev_add(&cdev, mkdev(mem_major, 0), memdev_nr_devs);

/* 為裝置描述結構分配記憶體*/

mem_devp = kmalloc(memdev_nr_devs * sizeof(struct mem_dev), gfp_kernel);

if (!mem_devp)

memset(mem_devp, 0, sizeof(struct mem_dev));

/*為裝置分配記憶體*/

for (i=0; i < memdev_nr_devs; i++) 

return 0;

fail_malloc: 

unregister_chrdev_region(devno, 1);

return result;

}/*模組解除安裝函式*/

static __exit void memdev_exit(void)

module_license("gpl");

module_version("v1.0");

module_author("[email protected]");

module_description("char driver module");

module_alias("char driver module");

module_init(memdev_init);

module_exit(memdev_exit);

3、makefile

ifeq ($(kernelrelease),)

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

pwd := $(shell pwd)

all:                               

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

clean:                                             

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

else

obj-m := mem_dev.o

endif

4、應用程式

#include

#include

int main(void)

/*寫入裝置*/

fwrite(buf, sizeof(buf), 1, fp0);

/*重新定位檔案位置(思考沒有該指令,會有何後果)*/

fseek(fp0,0,seek_set);

/*清除buf*/

strcpy(buf,"buf is null!");

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

/*讀出裝置*/

fread(buf, sizeof(buf), 1, fp0);

/*檢測結果*/

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

fclose(fp0);

fp0 = null;

return 0;

5、驗證

1、sudo insmod mem_dev.ko

2、sudo mknod /dev/memdev0 c 238 0

sudo mknod /dev/memdev1 c 238 1

sudo chmod 0666 /dev/memdev*

3、4、

./test

5、觀察結果

寫入什麼資料,讀出什麼資料。

驅動 linux裝置驅動 字元裝置驅動開發

preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...

Linux裝置驅動之《字元裝置驅動》

linux裝置中最大的特點就是裝置操作猶如檔案操作一般,在應用層看來,硬體裝置只是乙個裝置檔案。應用程式可以像操作檔案一樣對硬體裝置進行操作,如open close read write 等。下面是乙個字元裝置驅動程式的簡單實現test.c 模組分析 1.初始化裝置驅動的結構體 struct fil...

Linux裝置驅動之字元裝置驅動

一 linux裝置的分類 linux系統將裝置分成三種基本型別,每個模組通常實現為其中某一類 字元模組 塊模組或網路模組。這三種型別有 字元裝置 字元裝置是個能夠像位元組流 類似檔案 一樣被訪問的裝置,由字元裝置驅動程式來實現這種特性。字元裝置可以通過檔案系統節點來訪問,比如 dev tty1等。這...