在学习这位作者对S3C24xx的LED驱动程序笔记的基础上,整理下自己的学习笔记,加深理解。
参考:https://blog.csdn.net/woshidahuaidan2011/article/details/51695106
首先common-smdk.c函数位于linux-3.4.2\arch\arm\mach-s3c24xx目录下
1.构建设备信息结构体
static struct s3c24xx_led_platdata smdk_pdata_led4 = {
.gpio = S3C2410_GPF(4),
.flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
.name = "led4",
.def_trigger = "timer",
};
struct s3c24xx_led_platdata {
unsigned int gpio;
unsigned int flags;
char *name;
char *def_trigger;
};
该结构体中包含设备的名称、设备的引脚、标志(低电平有效也就是低电平灯亮,三态无效)以及触发方式。
目前有以下几种触发方式:
“backlight” – 受帧缓存器系统的控制,led此时作为背光灯LED
“default-on” – 此时led亮灭受对应LED引脚的控制
“heartbeat” –led收到其控制频率的双倍的闪动
“ide-disk” - LED 指示磁盘有活动
“timer” - LED 以设定的频率闪动
2.定义平台设备信息
static struct platform_device smdk_led4 = {
.name = "s3c24xx_led",
.id = 0,
.dev = {
.platform_data = &smdk_pdata_led4,
},
};
struct platform_device {
const char * name;
int id;
struct device dev;
u32 num_resources;
struct resource * resource;
const struct platform_device_id *id_entry;
/* MFD cell pointer */
struct mfd_cell *mfd_cell;
/* arch specific additions */
struct pdev_archdata archdata;
};
这里定义平台设备信息,这里的三个led的平台设备名称为s3c24xx_led,改名字用作sys/device下显示的目录名,这个名字很重要,后期设备信息与驱动的匹配就依靠该设备名;接下来是id号码,id用于给具有相同平台设备名的几个设备各自不同的编号,如果只有一个设备,通常填-1;然后是一个设备结构体,这里只填写该结构体的platform_data信息,在结构体device中,platform_data就是linux为了适应不同的单板(比如单板的封装、硬件的引脚的连线等不同),告诉系统本单板是如何连线等硬件结构的。比如led通过platform_data指出了其连接led的引脚,工作状态,led单个设备的名字和触发方式等信息。系统通过调用dev_get_platdata函数来获取platform_data的信息。
从c语言定义上来理解platform_data的话,其定义 void *platform_data,也就是一个void类型的指针,可以指向任何类型,因此可以理解为platform_data可以是人为任意定义的东西,这个东西只是让驱动设计者传递驱动程序想要传入进去的信息而已。
3.若平台设备信息有多个,则定义一个platform_device结构体数组指针
/* devices we initialise */