一、开发环境
- 主机:VMWare--Fedora 9
- 开发板:Mini2440--64MB Nand
- 编译器:arm-linux-gcc-4.3.2
二、实现步骤
本文引用地址:
//m.amcfsurvey.com/article/201611/319004.htm
1. 硬件原理图分析。由原理图得知LED电路是共阳极的,并分别由2440的GPB5、GPB6、GPB7、GPB8口控制的
2. 去掉内核已有的LED驱动设置,因为IO口与mini2440开发板的不一致,根本就不能控制板上的LED。
#gedit arch/arm/plat-s3c24xx/common-smdk.c//注释掉以下内容 |
staticstructplatform_device __initdata*smdk_devs[]={ &s3c_device_nand,
}; |
void__init smdk_machine_init(void) {
if(machine_is_smdk2443()) smdk_nand_info.twrph0=50;
s3c_device_nand.dev.platform_data=&smdk_nand_info;
platform_add_devices(smdk_devs,ARRAY_SIZE(smdk_devs));
s3c_pm_init(); } |
3. 编写适合mini2440开发板的LED驱动,代码如下,文件名称:my2440_leds.c
#include
#include
#include
#include
#include
#include
#include
#define
DEVICE_NAME
"my2440_leds"
//设备名称
#define
LED_MAJOR
231
//主设备号
#define
LED_ON
1
//LED亮状态
#define
LED_OFF
0
//LED灭状态
static
unsigned
long
led_table[]
=
//控制LED的IO口
{
S3C2410_GPB5,
S3C2410_GPB6,
S3C2410_GPB7,
S3C2410_GPB8,
};
static
unsigned
int
led_cfg_table[]
=
//LED IO口的模式
{
S3C2410_GPB5_OUTP,
S3C2410_GPB6_OUTP,
S3C2410_GPB7_OUTP,
S3C2410_GPB8_OUTP,
};
static
int
leds_open(struct
inode
*inode,
struct
file
*file)
{
return
0;
}
static
int
leds_ioctl(struct
inode
*inode,
struct
file
*file,
unsigned
int
cmd,
unsigned
long
arg)
{
//检测是第几个LED,因开发板上只有4个,索引从0开始
if(arg
<
0
||
arg
>
3)
{
return
-EINVAL;
}
//判断LED要执行哪种状态
switch(cmd)
{
case
LED_ON:
|