Real6410/S3C6410裸机LCD驱动
简述:能够在裸机驱动LCD,并显示图片,打印字符串的裸机程序。
一、编写目的及环境
-
编写目的
手上有块real6410开发板,最近为其移植了个u-boot-2012.10。然后想把u-boot的控制台终端改到LCD显示。初次尝试不成功便想从简单入手,先写个裸机的驱动,再移 植到u-boot中。
-
环境
上位机:ubuntu12.04系统、arm-none-eabi-gcc4.6.1交叉编译器、有tftp服务。
开发板:运行开发板自带u-boot-1.1.6,通过tftp命令下载程序、go命令执行程序。
-
板上LCD为wxcat43-tg3
通迅:kermit显示控制开发板上的u-boot。
特别说明:由于没有仿真器,如果使用SD卡起动调试太过麻烦,所以这里用u-boot下载执行。
二、编译命令
在使用u-boot执行生成的程序期间经常发生”dataabort”。应该都是对齐引起的,后来采用了链接脚本后情况有所好转,担也还是时有发生,原因还在分析中。
-
Makefile文件
led_test:
arm-none-eabi-gcc -o lcd.o lcd.c -c#编译主程序不链接
arm-none-eabi-gcc -o my_debug.o my_debug.S -c#编译主程序不链接
arm-none-eabi-ld-T u-boot.lds -Bstatic -Ttext 0xc0008000 -g lcd.o my_debug.o -olcd.elf#链接程序,指定链接脚本并将代码段重定位到到地址0xc0008000
arm-none-eabi-objcopy-O binary -S lcd.elf lcd.bin#将生成的elf文件处理成bin文件
sudocp -v lcd.bin /design/tftproot/#将生成的文件复制到tftp服务的目录方便下载
这里的my_debug.S是控制开发板上led灯亮灭的,用于调试,可要可不要。
-
链接脚本u-boot.lds
这个是从u-boot源码目录复制来的。其实只要.text.rodata .data段就可以了。
OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
.= 0x00000000;
.= ALIGN(4);#关键是这个,让代码段4字节对齐
.text:
{
*(.text)
}
.= ALIGN(4);
.rodata: { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
.= ALIGN(4);
.data: { *(.data) }
.= ALIGN(4);
.got: { *(.got) }
__u_boot_cmd_start= .;
.u_boot_cmd: { *(.u_boot_cmd) }
__u_boot_cmd_end= .;
.= ALIGN(4);
.mmudata: { *(.mmudata) }
.= ALIGN(4);
.rel.dyn: {
__rel_dyn_start= .;
*(.rel*)
__rel_dyn_end= .;
}
.dynsym: {
__dynsym_start= .;
*(.dynsym)
}
_end= .; PROVIDE(end = .);
.bss__rel_dyn_start (OVERLAY) : {
__bss_start= .;
*(.bss)
.= ALIGN(4);
__bss_end__= .;
}
/DISCARD/: { *(.dynstr*) }
/DISCARD/: { *(.dynamic*) }
/DISCARD/: { *(.plt*) }
/DISCARD/: { *(.interp*) }
/DISCARD/: { *(.gnu*) }
}
-
三、源文件