混杂设备LED驱动程序(GPIO操作函数实现)

混杂设备LED驱动程序(GPIO操作函数实现)_第1张图片

mini2440LED对应的IO

LED1

GPB5

LED2

GPB6

LED3

GPB7

LED4

GPB8

低电平有效(点亮)

寄存器:

GPxCON

设置端口功能(00表示输入,01表示输出,10表示特殊功能,11保留不用)

GPxDAT

用于读写数据

GPxUP

用于是否使用内部上拉电阻(0表示无上拉,1表示上拉)

混杂设备驱动

在Linux系统中,存在一类字符设备,它们共享一个主设备号(一定要是10但次设备号不同,我们称这类设备为混杂设备。所有的混杂设备形成一个链表,对设备访问时内核根据次设备号查找到相应的混杂设备。

Linux内核使用structmiscdevice来描述一个混杂设备

structmiscdevice

{

intminor;//次设备号

constchar*name;//设备名

conststructfile_operation*fops;//文件操作

structlist_headlist;

structdevice*parent;

structdevice*this_device;

}

Linux内核使用structmiscdevice函数来注册一个混杂设备驱动

intmisc_register(structmiscdevice*misc)

注销一个混杂设备驱动

misc_deregister(&misc);

混杂设备LED驱动程序:


测试程序:

这个驱动程序关键是


s3c2410_gpio_setpin(led_table[arg], !cmd);

内核定义好的GPIO接口(S3C2410_GPB5和S3C2410_GPB5_OUTP)和GPIO操作函数(s3c2410_gpio_setpin和s3c2410_gpio_cfgpin)。可移植性好,也是正确的做法。内核的GPIO操作函数也是通过一些的运算将GPIO接口换算成虚拟内存地址然后进行访问的。

提示:

sscanf

语法:

#include<stdio.h>

intsscanf(constchar*buffer,constchar*format,...);

函数sscanf()scanf()类似,只是输入从buffer(缓冲区)中读取.

sscanf(argv[1],"%d",&on)

表示从字符串argv[1]转化成整形,再赋值给on

使用:

1)用Makefile编译成ko文件放到开发板上

2)arm-linux-gcc led_test.c -o led_test 编译后放到开发板上

3)insmod mini2440_leds.ko加载模块

4)./led_test 0 再./led_test 1测试

5)rmmod mini2440_leds卸载

混杂设备LED驱动程序(GPIO操作函数实现)_第2张图片

你可能感兴趣的:(IO)