树莓派驱动学习字符设备驱动LED文档格式.docx
- 文档编号:21398964
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:20
- 大小:21.79KB
树莓派驱动学习字符设备驱动LED文档格式.docx
《树莓派驱动学习字符设备驱动LED文档格式.docx》由会员分享,可在线阅读,更多相关《树莓派驱动学习字符设备驱动LED文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
linux/init.h>
13.#include
linux/serio.h>
14.#include
linux/delay.h>
15.#include
linux/clk.h>
16.#include
linux/miscdevice.h>
17.#include
linux/gpio.h>
18.#include
asm/io.h>
19.#include
asm/irq.h>
20.#include
asm/uaccess.h>
21.#include
linux/cdev.h>
22.
23.MODULE_AUTHOR("
Xu"
);
24.MODULE_LICENSE("
Dual
BSD/GPL"
25.
26.static
unsigned
int
led_major=0;
27.static
bcm2835_gpio_baseaddr;
28.
29.module_param(led_major,int,0);
30.
31.#define
LED_MAGIC
'
k'
32.#define
LED_ON_CMD
_IO(LED_MAGIC,1)
33.#define
LED_OFF_CMD
_IO(LED_MAGIC,2)
34.
35.//#define
BCM2835_PERI_BASE
0x20000000
36.//#define
0x7e000000
37.#define
BCM2835_GPIO_BASE
0x20200000
38.#define
BCM2835_GPIOReg_GPFSEL0
0x00000000
39.#define
BCM2835_GPIOReg_GPSET0
0x0000001c
40.#define
BCM2835_GPIOReg_GPCLR0
0x00000028
41.#define
BCM2835_GPIO_FSEL_INP
42.#define
BCM2835_GPIO_FSEL_OUTP
0x00000001
43.#define
RPI_BPLUS_GPIO_J8_12
18
44.
45.int
bcm2835_gpio_fsel(int
pin,
mode)
46.{
47.
volatile
shift,value;
48.
*bcm2835_gpio_fsel_addrp
=
bcm2835_gpio_baseaddr
+
(pin/10)*4;
49.
//printk("
In
bcm2835_gpio_fsel
function:
\n"
50.
pin
%d,
(pin/10)*4=
%d"
pin,(pin/10)*4);
51.
0x%x\n"
bcm2835_gpio_baseaddr);
52.
bcm2835_gpio_fsel_addrp
0x%p\n"
bcm2835_gpio_fsel_addrp);
53.
54.
shift
(pin
%
10)
*
3;
55.
value
mode
shift;
56.
shift=%d,value=0x%x\n"
shift,value);
57.
addr
0x%p:
bcm2835_gpio_fsel_addrp,
*bcm2835_gpio_fsel_addrp);
58.
(*bcm2835_gpio_fsel_addrp)
|
value;
59.
60.
return
0;
61.}
62.int
bcm2835_gpio_set(int
pin)
63.{
64.
65.
*bcm2835_gpio_set_addrp
(pin/32)*4;
66.
bcm2835_gpio_set
67.
68.
bcm2835_gpio_set_addrp
bcm2835_gpio_set_addrp);
69.
70.
32;
71.
1
72.
73.
bcm2835_gpio_set_addrp,
*bcm2835_gpio_set_addrp);
74.
(*bcm2835_gpio_set_addrp)
75.
76.
77.}
78.int
bcm2835_gpio_set_release(int
79.{
80.
81.
*bcm2835_gpio_set_release_addrp
82.
bcm2835_gpio_set_release
83.
84.
bcm2835_gpio_set_release_addrp
bcm2835_gpio_set_release_addrp);
85.
86.
87.
=~(1
shift);
88.
89.
90.
bcm2835_gpio_set_release_addrp,
*bcm2835_gpio_set_release_addrp);
91.
(*bcm2835_gpio_set_release_addrp)
&
92.
93.
94.}
95.int
bcm2835_gpio_clr(int
96.{
97.
98.
*bcm2835_gpio_clr_addrp
99.
bcm2835_gpio_clr
100.
101.
bcm2835_gpio_clr_addrp
bcm2835_gpio_clr_addrp);
102.
103.
104.
105.
106.
bcm2835_gpio_clr_addrp,
*bcm2835_gpio_clr_addrp);
107.
(*bcm2835_gpio_clr_addrp)
108.
109.
110.}
111.int
bcm2835_gpio_clr_release(int
112.{
113.
114.
*bcm2835_gpio_clr_release_addrp
115.
bcm2835_gpio_clr_release
116.
117.
bcm2835_gpio_clr_release_addrp
bcm2835_gpio_clr_release_addrp);
118.
119.
120.
=~(
121.
122.
bcm2835_gpio_clr_release_addrp,
*bcm2835_gpio_clr_release_addrp);
123.
(*bcm2835_gpio_clr_release_addrp)
124.
125.
126.}
127.
128.void
led_on(int
129.{
130.
bcm2835_gpio_fsel(pin,
BCM2835_GPIO_FSEL_OUTP);
131.
bcm2835_gpio_set(pin);
132.}
133.void
led_off(int
134.{
135.
136.
bcm2835_gpio_clr(pin);
137.}
138.int
led_open(struct
inode
*inode,
struct
file
*filp)
139.{
140.
141.}
142.size_t
led_release(struct
*flip)
143.{
144.
145.
bcm2835_gpio_fsel(RPI_BPLUS_GPIO_J8_12,
BCM2835_GPIO_FSEL_INP);
146.
bcm2835_gpio_set_release(RPI_BPLUS_GPIO_J8_12);
147.
bcm2835_gpio_clr_release(RPI_BPLUS_GPIO_J8_12);
148.
149.}
150.ssize_t
led_read(struct
*flip,
char
__user
*buff,
size_t
count,
loff_t
*offp)
151.{
152.
153.}
154.ssize_t
led_write(struct
const
155.{
156.
157.}
158.static
led_ioctl(struct
cmd,
long
arg)
159.{
160.
switch(cmd){
161.
case
LED_ON_CMD:
{
162.
led_on(RPI_BPLUS_GPIO_J8_12);
break;
163.
}
164.
LED_OFF_CMD:
165.
led_off(RPI_BPLUS_GPIO_J8_12);
166.
167.
default:
168.
169.
170.
171.
172.}
173.static
void
led_setup_cdev(struct
cdev
*dev,
minor,
file_operations
*fops)
174.{
175.
err,devno
MKDEV(led_major,
minor);
176.
cdev_init(dev,
fops);
177.
dev->
owner
THIS_MODULE;
178.
ops
fops;
179.
err
cdev_add(dev,
devno,
1);
180.
if
(err)
181.
printk(KERN_WARNING
"
Error
%d
adding
beep%d"
err,minor);
182.}
183.static
led_cdev;
184.static
led_fops
185.
.owner
THIS_MODULE,
186.
.read
led_read,
187.
.write
led_write,
188.
.unlocked_ioctl
led_ioctl,
189.
.open
led_open,
190.
.release
led_release,
191.
192.};
193.static
__init
led_init(void)
194.{
195.
result;
196.
dev_t
dev
MKDEV(led_major,0);
197.
dev_name[]="
led"
;
198.
199.
bcm2835_gpio_baseaddr=ioremap(0x20200000,0x100000);
200.
if(!
bcm2835_gpio_baseaddr){
201.
-EIO;
202.
203.
(led_major)
204.
result
register_chrdev_region(dev,1,dev_name);
205.
else{
206.
alloc_chrdev_region(&
dev,0,1,dev_name);
207.
led_major=MAJOR(dev);
208.
209.
(result
0){
210.
led:
unable
to
get
major
%d\n"
led_major);
211.
212.
213.
led_setup_cdev(&
led_cdev,0,&
led_fops);
214.
printk("
device
installed,
with
led_major);
215.
The
name
is:
%s\n"
dev_name);
216.
217.}
218.static
__exit
led_exit(void)
219.{
220.
cdev_del(&
led_cdev);
221.
unregister_chrdev_region(MKDEV(led_major,0),1);
222.
iounmap(bcm2835_gpio_baseaddr);
223.
uninstalled\n"
224.}
225.mo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 树莓派 驱动 学习 字符 设备 LED