使用靜態裝置節點的cdev字元驅動GPIO

2021-09-08 03:19:32 字數 3065 閱讀 7897

檔案:beep.rar

大小:21kb

儘管在2.6的核心版本已經支援udev,可以很方便的使用,並且使用也很舒服。但是使用udev,在啟動過程中掃瞄/sys/class目錄並生成裝置節點的時間稍微有點長,在一些系統中是無法忍受的,所以沒辦法只好放棄udev,回到靜態裝置節點的時代,以加快啟動速度。

2.6核心中,引入了cdev概念,使用cdev的驅動與傳統的2.4的字元驅動又不一樣,下面給出乙個使用cdev和靜態裝置節點的驅動範例。

beepdrv.c

1

/*beepdrv.c

2beep driver. guangzhou zhiyuan34

5by chenxibing 6*/

78 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 #include 18 #include 19 #include 20 #include 21 #include 22 #include 23

24 #include 25 #include 26 #include 27 #include 28 #include 29 #include 30

31 #include 32 #include 33

34 #include 35

36 #include "

beepdrv.h"37

38#define dev_name "beep"

39struct cdev *beep_cdev;

40#define beep_major 231

41#define beep_minor 0

42int beep_major =beep_major;

43int beep_minor =beep_minor;

4445 module_param(beep_major, int, 0

);46 module_param(beep_minor, int, 0

);47

48#define gpio_iobase io_p2v(gpio_base)

4950

static

struct

semaphore beep_sem;

5152

static

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

5360

61static

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

6269

70static

int beep_ioctl(struct inode *inode, struct file *filp,

71 unsigned int cmd, unsigned long

arg)

7278

79if (_ioc_nr(cmd) >=beep_ioc_maxnr)

8283

//printk("arg=0x%x\n", arg);

8485

8687

switch

(cmd)

105106

return0;

107}

108109

static

struct file_operations beep_fops =;

115116

static

void beep_setup_cdev(struct cdev *dev)

117128

129static

int __init beep_init(void

)130

148if (result < 0

)149

return

result;

150151 beep_cdev =cdev_alloc();

152if (!beep_cdev)

156 beep_setup_cdev(&beep_cdev);

157 printk(dev_name "

registered ok.\n");

158return0;

159fail:

160 cdev_del(&beep_cdev);

161 unregister_chrdev_region(mkdev(beep_major, beep_minor), 1

); 162

//beep_exit();

163164

return

result;

165}

166167

static

int __exit beep_exit(void

)168

173174

175module_init(beep_init);

176module_exit(beep_exit);

177178 module_author("

abing ");

179 module_description("

zhiyuan tp-beep driver");

180 module_license("

gpl");

beepdrv.h

1

#ifndef __beepdrv_h

2#define __beepdrv_h

3 #include 4

5#define beep_ioc_magic 'b'67

#define set_beep_on _io(beep_ioc_magic, 0)

8#define set_beep_off _io(beep_ioc_magic, 1)910

#define beep_ioc_maxnr 2

1112

#endif

//__beepdrv_h

Linux 字元裝置驅動cdev

關鍵字 字元裝置檔案建立 device create 字元裝置cdev 與裝置號dev t的聯絡 sys class 目錄下建立類目錄class create linux下面一切皆是檔案,這句是有 的,這個 起因,應該就是vfs 虛擬檔案系統,將soc下面的所有外設,都抽象成乙個個檔案進行管理。外設...

Linux字元裝置驅動 cdev結構體day00

day00 摘要 linux字元裝置驅動cdev結構體 1.cdev結構體 描述乙個字元裝置 定義 struct 1 dev t定義裝置號,32位,12位主裝置號,20位次裝置號.2 使用巨集major,minor可以獲得裝置主次號 major dev t dev 主裝置號 minor dev t ...

字元裝置裝置節點建立的兩種方法

在linux下,字元裝置和塊裝置都體現了 一切皆為檔案 的思想,對於這兩種裝置而言,他們在linux系統中都有乙個對應的檔案來 代表 它們的存在,那就是裝置檔案。應用程式通過操作某個裝置檔案,便可以操作對應的硬體。裝置有主裝置號和次裝置號,例如在linux下通過ls l dev ttys0命令可以看...