移植环境(红色粗字体字为修改后内容,蓝色粗体字为特别注意内容)
1,主机环境:VMare下CentOS 5.5 ,1G内存。
2,集成开发环境:Elipse IDE
3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。
4,开发板:mini2440,2M nor flash,128M nand flash。
5,u-boot版本:u-boot-2009.08
6,linux 版本:linux-2.6.32.2
7,参考文章:
嵌入式linux应用开发完全手册,韦东山,编著。
Mini2440 之Linux 移植开发实战指南
到目前为止,我们一直都在命令行下移植,查看结果,LCD 屏幕上似乎总是如伸手不见五指的黑夜,神秘而又无可奈何,从这里开始,我们就要打开这道神秘之门了。
【1】LCD 背光控制原理
在 mini2440/micro2440 开发板中,LCD 背光是通过CPU 的LCD_PWR 引脚来控制的,从原理图中可以看出,它对应于GPG4,如图
当LCD_PWR 输出为高电平“1”时,将打开背光;当输出为低电平“0”时,将关闭背光(注意:这里只是打开和关闭背光,而并没有背光亮度的调节作用)。
【2】 在内核中添加背光驱动程序
现在,我们需要增加一个简单的背光驱动,以便能够通过软件便可简单的控制背光的开关。我们要达到的目的是:在命令终端通过向背光设备发送偶数比如“0”便可关闭背光,发送奇数比如“1”便可打开背光,这样使用起来就方便多了,而不需要专门的应用程序控制它,正如在用户手册中所描述的方法(2.5.10 控制LCD 的背光):
提示:LCD 背光设备文件:/dev/backlight
在命令行种输入:echo 0 > /dev/backlight 可以关闭LCD 背光。
在命令行种输入:echo 1 > /dev/backlight 可以打开LCD 背光。
为了实现这点,我们在linux-2.6.32.2/drivers/video/backlight 目录增加一个mini2440_backlight.c文件,内容如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define DEVICE_NAME "backlight" //设备名称
#define DEVICE_MINOR 5 //次设备号,这里我们将设备注册为misc设备,这种设备的主设备号都为10
extern void s3c2410_gpio_setpin(unsigned int pin, unsigned int to);
extern void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function);
static int mini2440_backlight_ioctl(struct inode *inode,
struct file *file,
unsigned int cmd,
unsigned long arg)
{
switch(cmd)
{
case 0:
//当接收的命令为0时,就将GPG4引脚设为低电平,关闭背光
s3c2410_gpio_setpin(S3C2410_GPG(4), 0);
printk(DEVICE_NAME " turn off!\n");
return 0;
case 1:
//当接收的命令为1时,就将GPG4引脚设为高电平,开启背光
s3c2410_gpio_setpin(S3C2410_GPG(4), 1);
printk(DEVICE_NAME " turn on!\n");
return 0;
default:
return -EINVAL;
}
}
static struct file_operations dev_fops =
{
.owner = THIS_MODULE,
.ioctl = mini2440_backlight_ioctl, //这里只使用控制IO口的方式来控制背光
};
static struct miscdevice misc =
{
.minor = DEVICE_MINOR,
.name = DEVICE_NAME,
.fops = &dev_fops,
};
static int __init dev_init(void)
{
int ret;
ret = misc_register(&misc); //注册成misc设备
if(ret < 0)
{
printk("Register misc device fiald!");
return ret;
}
//将GPG4口配置成输出口
s3c2410_gpio_cfgpin(S3C2410_GPG(4), S3C2410_GPIO_OUTPUT);
return ret;
}
static void __exit dev_exit(void)
{
misc_deregister(&misc); //注销该misc设备
}
module_init(dev_init);
module_exit(dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("singleboy");
MODULE_DESCRIPTION("Backlight control for mini2440");
【3】把背光配置选项加入内核配置菜单
打开linux-2.6.32.2/drivers/video/backlight/Kconfig,定位到1929行附近,加入如下代码:
#
# Backlight & LCD drivers configuration
#
menuconfig BACKLIGHT_LCD_SUPPORT
bool "Backlight & LCD device support"
help
Enable this to be able to choose the drivers for controlling the
backlight and the LCD panel on some platforms, for example on PDAs.
#在里加入MINI2440 的背光驱动配置
config BACKLIGHT_MINI2440
tristate "Backlight support for mini2440 from FriendlyARM"
depends on BACKLIGHT_LCD_SUPPORT
help
backlight driver for MINI2440 from FriendlyARM
#
# LCD
#
config LCD_CLASS_DEVICE
再打开 linux-2.6.32.2/drivers/video/backlight/Makefile,定位到文件末尾,根据配置定义加入驱动目标文件,如下:
obj-$(CONFIG_BACKLIGHT_ADP5520) += adp5520_bl.o
obj-$(CONFIG_BACKLIGHT_MINI2440) += mini2440_backlight.o
这样,我们就在内核中移植好了 mini2440 的背光驱动。
【4】在内核配置菜单中确认 "Backlight support for mini2440 from FriendlyARM",被选中。
在内核源代码根目录执行:
make menuconfig,依次选择如下子菜单:
Device Drivers --->
Graphics support --->
[*] Backlight & LCD device support --->
就可以找到该配置选项,如图
在这里,如果没有被选中,按空格选中我们刚刚加入的mini2440 配置项,然后退出时保存内核配置菜单,在命令行执行:make uImage
将生成的arch/arm/boot/uImage复制到/nfsboot目录下,然后启动开发板,可以在启动时看到LCD屏显示的企鹅图像,这说明我们已经点亮了背光。
【5】编写测试程序linux-test/codetest/backlight_test.c,代码如下:
#include
#include
#include
#include
int main(int argc, char **argv)
{
int turn;
int fd;
//检测命令后面带的参数
if(argc == 1 || argc > 2)
{
printf("Usage: backlight_test on|off!\n");
exit(1);
}
//打开背光设备
fd = open("/dev/backlight", O_RDWR);
if(fd < 0)
{
printf("Open Backlight Device Faild!\n");
exit(1);
}
//判断输入的参数
if(strcmp(argv[1], "on") == 0)
{
turn = 1;
}
else if(strcmp(argv[1], "off") == 0)
{
turn = 0;
}
else
{
printf("Usage: backlight_test on|off!\n");
exit(1);
}
//进行IO控制
ioctl(fd, turn);
//关闭背光设备
close(fd);
return 0;
}
然后保存退出,之后在主机终端交叉编译
[root@localhost codetest]# arm-linux-gcc -o backlight_test backlight_test.c
将其复制到nfsboot目录下以便在开发板挂载该目录后能够执行
[root@localhost codetest]# cp backlight_test /nfsboot/nfs
【6】挂载nfs文件系统
在目标板的串口终端中执行
[root@mini2440 /mnt]#mkdir nfs
[root@mini2440 /mnt]#ls
data etc jffs2 nfs temp yaffs
[root@mini2440 /]#mount -o nolock -t nfs 10.1.0.128:/nfsboot/nfs /mnt/nfs //注意要加 -o nolock参数,否则挂载不上。
[root@mini2440 /]#cd mnt/nfs
[root@mini2440 nfs]#ls
backlight_test
【7】运行测试程序
[root@mini2440 nfs]#./backlight_test
[root@mini2440 nfs]#./backlight_test --help
Usage: backlight_test on|off!
[root@mini2440 nfs]#
[root@mini2440 nfs]#./backlight_test off
backlight turn off! //观察LCD屏,看到背光灯灭了
[root@mini2440 nfs]#./backlight_test on
backlight turn on! //观察LCD屏,看到背光灯亮了
[root@mini2440 nfs]#./backlight_test off
backlight turn off! //观察LCD屏,看到背光灯又灭了
[root@mini2440 nfs]#./backlight_test on
backlight turn on! //观察LCD屏,看到背光灯亮了
只不过LCD 驱动还有些问题,下一节我们将会详细的介绍如何移植LCD 驱动。