一、LCD驱动修改
一般uboot中修改驱动都是在对应板子c文件和h文件,即board/freescale/mx6ull_myboard/mx6ull_myboard.c
和 include/configs/mx6ull_myboard.h
这两个文件。
一般修改 LCD 驱动重点注意以下几点:
- LCD 所使用的 GPIO,查看 uboot 中 LCD 的 IO 配置是否正确
- LCD 背光引脚 GPIO 的配置
- LCD 配置参数是否正确
1.1 修改c文件配置
打开文件 mx6ull_myboard.c
,需要修改下面这段内容:
struct display_info_t const displays[] = {{
.bus = MX6UL_LCDIF1_BASE_ADDR,
.addr = 0,
.pixfmt = 24,
.detect = NULL,
.enable = do_enable_parallel_lcd,
.mode = {
.name = "TFT43AB",
.xres = 480,
.yres = 272,
.pixclock = 108695,
.left_margin = 8,
.right_margin = 4,
.upper_margin = 2,
.lower_margin = 4,
.hsync_len = 41,
.vsync_len = 10,
.sync = 0,
.vmode = FB_VMODE_NONINTERLACED
} } };
先来分析一下这段代码,该代码定义了一个变量displays
,类型为display_info_t
,这个结构体是LCD信息结构体,其中包括了LCD的分辨率,像素格式,LCD的各个参数等。
display_info_t
定义在文件 arch/arm/include/asm/imx-common/video.h 中,定义如下:
struct display_info_t {
int bus;
int addr;
int pixfmt;
int (*detect)(struct display_info_t const *dev);
void (*enable)(struct display_info_t const *dev);
struct fb_videomode mode;
};
这里的pixfmt
是像素格式,也就是一个像素点是多少位,如果是RGB565的话就是16位,如果是RGB888的话就是24位,一般使用 RGB888。
结构体display_info_t
还有个mode
成员变量,此成员变量也是个结构体,为fb_videomode
,定义在文件 include/linux/fb.h
中,定义如下:
struct fb_videomode {
const char *name; /* optional */
u32 refresh; /* optional */
u32 xres;
u32 yres;
u32 pixclock;
u32 left_margin;
u32 right_margin;
u32 upper_margin;
u32 lower_margin;
u32 hsync_len;
u32 vsync_len;
u32 sync;
u32 vmode;
u32 flag;
};
结构体b_videomode
里面的成员变量为LCD的参数,这些成员变量函数如下:
name
:LCD 名字,要和环境变量中的 panel 相等xres 、yres
:LCD X 轴和 Y 轴像素数量pixclock
:像素时钟,每个像素时钟周期的长度,单位为皮秒left_margin
:HBP(horizontal back porch),水平同步后肩right_margin
:HFP(horizontal front porch),水平同步前肩upper_margin
:VBP(vertical back porch),垂直同步后肩lower_margin
:VFP(vertical front porch),垂直同步前肩hsync_len
:HSPW(horizontal sync pulse width),行同步脉宽vsync_len
:VSPW(vertical sync pulse width),垂直同步脉宽vmode
:大多数使用 FB_VMODE_NONINTERLACED,也就是不使用隔行扫描。
这些参数需要与实用的LCDd的参数一致。
野火的7寸RGB屏幕(GT911,800x480)的一些参数如下:
参数 | |
---|---|
width | 800 |
height | 480 |
HBP | 46 |
HFP | 22 |
VBP | 23 |
VFP | 22 |
HSW | 1 |
VSW | 1 |
注意像素时钟pixclock
的计算方法:以野火的 7 寸RGB屏为例,屏幕要求的像素时钟为27.4MHz,因此:pixclock=(1/27400000)*10^12=36496
像素时钟就是 RGB LCD 的时钟信号,以 GT911这款屏幕为例,显示一帧图像所需要的时钟数就是: (VSPW+VBP+LINE+VFP) * (HSPW + HBP + HOZVAL + HFP) = (1 + 23 + 480+ 22) * (1+ 46+ 800+ 22) = 526* 869 = 457094。 显示一帧图像需要457094个时钟数, 那么显示60帧就是: 457094* 60 = 27425640≈27.4M,所以像素时钟就是27.4MHz
由以上的屏幕参数,可以得出GT911屏幕的配置参数如下:
struct display_info_t const displays[] = {{
.bus = MX6UL_LCDIF1_BASE_ADDR,
.addr = 0,
.pixfmt = 24,
.detect = NULL,
.enable = do_enable_parallel_lcd,
.mode = {
.name = "GT911",
.xres = 800,
.yres = 480,
.pixclock = 36496,
.left_margin = 46, //HBPD
.right_margin = 22, //HFPD
.upper_margin = 23, //VBPD
.lower_margin = 22, //VFPD
.hsync_len = 1, //HSPW
.vsync_len = 1, //VSPW
.sync = 0,
.vmode = FB_VMODE_NONINTERLACED
} } };
1.2 修改h文件配置
另外还要修改include/configs/
路径下的mx6ull_myboard.h
,找到所有如下语句:
panel=TFT43AB
修改为:
panel=GT911 //与mx6ull_myboard.c中修改的名称保持一致
修改完成以后重新编译一遍 uboot 并烧写到 SD 中启动。
1.3 编译测试
将修改后的uboot编译下载以后,LCD 驱动一般就会工作正常了,LCD 上会显示 NXP 的 logo。
但某些情况有可能还会遇到LCD 并没有工作,还是黑屏,这是什么原因呢?
在 uboot 命令模式输入“print
”来查看环境变量 panel 的值,会发现panel的值要是TFT43AB(或其他的,反正不是GT911):
panel=TFT43AB
script=boot.scr
Environment size: 2431/8188 bytes
=>
这是因为之前有将环境变量保存到EMMC中,uboot启动以后会先从EMMC中读取环境变量,如果EMMC中没有环境变量的话才会使用 mx6ull_alientek_emmc.h 中的默认环境变量。
如果EMMC中的环境变量panel不等于GT911,那么LCD显示肯定不正常,我们只需要在uboot中修改panel的值为GT911即可,在uboot的命令模式下输入如下命令:
setenv panel GT911
saveenv
上述命令修改环境变量panel为GT911并保存后,按下复位键重启uboot,此时 LCD 驱动就工作正常了。
二、网络驱动修改
U-Boot(Universal Boot Loader)需要网络驱动程序的原因有几个:
-
远程启动和更新镜像: U-Boot 可以通过网络从远程服务器下载启动镜像,从而支持远程启动系统。这在嵌入式系统中很常见,特别是在网络启动时,网络驱动程序是必不可少的。
-
网络调试和测试: 在开发过程中,网络驱动程序使得开发人员可以通过网络与设备进行交互、调试和测试,而无需依赖本地存储介质。在调试过程中免去了繁琐的重复烧写。
-
网络引导设备: 一些嵌入式系统可能没有本地存储设备,或者希望通过网络引导操作系统。在这种情况下,U-Boot 需要能够通过网络访问启动镜像
三、设置环境变量bootcmd 和 bootargs
环境变量 bootcmd
#define CONFIG_BOOTCOMMAND \
mmc dev 1 //切换到 EMMC
fatload mmc 1:1 0x80800000 zImage //读取 zImage 到 0x80800000 处
fatload mmc 1:1 0x83000000 imx6ull-14x14-evk.dtb //读取设备树到 0x83000000 处
bootz 0x80800000 - 0x83000000 //启动 Linux
setenv bootcmd 'mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000;
环境变量 bootargs
mmcargs=setenv bootargs console= ttymxc0, 115200 root= /dev/mmcblk1p2 rootwait rw