在嵌入式系统里,想要对GPIO管脚等进行操作的话,需要在内核中注册一个字符设备及相应的驱动。字符设备提供了对IO地址的映射,从而可以使用虚拟地址对各寄存器进行读写。字符设备驱动实现设备的初始化,关联到设备文件,提供通用的open、release、ioctl、read、write等接口。最终应用程序才能通过这些文件接口,间接控制设备。设备号分为主设备号和次设备号,
设备驱动通过主设备号来与设备文件关联,通过次设备号来与串口关联。platform总线会分别遍历驱动链表和设备链表,通过name字段来匹配驱动和设备。因此,字符设备的创建步骤分为:
1、准备IO资源,即填写resource结构体
2、填写platform_device设备结构体
3、调用platform_device_register注册设备
4、填写字符设备文件接口file_operations
5、注册字符设备驱动,得到主设备号
6、通过设备号,创建设备文件
7、映射IO地址到虚拟地址
例1:蜂鸣器驱动
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#define BEEP_ON (0x10007) //自定义命令
#define BEEP_OFF (0x10008)
#define BEEP_DISABLE (0x10009)
#define BEEP_ENABLE (0x1000a)
static int disable=0;
static int major;
static struct class *beep_class;
static unsigned long *gpio_con;
static unsigned long *gpio_data;
static int pin;
static struct resource beep_resources[] = {