2024年最新i,物联网嵌入式开发面试宝典

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

下面进行LCD驱动的修改。

3 LCD驱动的修改

一般uboot中修改驱动都是在对应板子c文件和h文件,即board/freescale/mx6ull_myboard/mx6ull_myboard.cinclude/configs/mx6ull_myboard.h这两个文件。

一般修改 LCD 驱动重点注意以下几点:

  • LCD 所使用的 GPIO,查看 uboot 中 LCD 的 IO 配置是否正确
  • LCD 背光引脚 GPIO 的配置
  • LCD 配置参数是否正确

正点原子以及野火的I.MX6ULL开发板的LCD原理图和NXP官方的开发板一致,也就是LCD的IO和背光IO都是一样的, 所以IO部分就不用修改了,只需修改之后的LCD参数。

3.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)的一些参数如下:

参数
width800
height480
HBP46
HFP22
VBP23
VFP22
HSW1
VSW1

注意像素时钟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
} } };

3.2 修改h文件配置

另外还要修改include/configs/路径下的mx6ull_myboard.h,找到所有如下语句:

panel=TFT43AB 

修改为:

panel=GT911 //与mx6ull\_myboard.c中修改的名称保持一致

修改完成以后重新编译一遍 uboot 并烧写到 SD 中启动。

3.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 驱动就工作正常了。

4 网络测试

I.MX6ULL内部有个以太网MAC外设,也就是ENET,需要外接一个PHY芯片来实现网络通信功能,也就是内部MAC+外部PHY芯片的方案。 I.MX6ULL有两个网络接口ENET1和ENET2,野火的开发板提供了这两个网络接口,其中ENET1和ENET2都使用是和原厂开发板一样的KSZ8081作为PHY芯片。

因此,网络驱动部分的uboot不需要修改,下面就只是来测试一下网路功能。

4.1 连接网线并查看启动情况

首先将开发板通过网线连接到局域网的路由器中(自己的电脑也要在同一个局域网,这样ubuntu虚拟机则也在同一个局域网)。

然后启动uboot,串口查看相关的打印信息,如下图,可以看到网络端口的FEC1(注意是uboot程序中默认设置的,不是因为网线插在了左边就自动识别FEC1),但是提示网络地址未设置。

4.2 设置网络参数

下面就来设置一下,首先是设置开发板的IP,在设置之前,先借助Windows电脑的cmd的ping+ip指令来测试某个IP是否被使用,如我的192.168.5.102未被使用,就可以设为开发板的IP。

除了设置开发板的IP,还要设置一些其它的网络参数,具体如下:

setenv ipaddr 192.168.5.102 //开发板 IP 地址
setenv ethaddr 00:04:9f:04:d2:35 //开发板网卡 MAC 地址
setenv gatewayip 192.168.5.1 //开发板默认网关
setenv netmask 255.255.255.0 //开发板子网掩码
setenv serverip 192.168.5.101 //服务器地址,也就是 Ubuntu 地址
saveenv //保存环境变量

开发板的MAC地址是一个长度为48位(6个字节)的地址,每个字节间通过冒号间隔,理论上只要局域网内各网络设备不冲突,该地址可任意设置。

局域网的默认网关和子网掩码需要根据自己的实际情况设置(不知道是多少的,可以借助Windows电脑的cmd中的ipconfig指令来查看)

服务器的地址就是ubuntu虚拟机的地址(可以通过linux的ifconfig指令来查看)

4.3 测试另一个网口

打开 include/configs/mx6ull_alientek_emmc.h ,将CONFIG_FEC_ENET_DEV修改为 0, 重新编译uboot并烧写到SD卡中。

将网线连接到开发板右边的网口上,按照之前的测试方法再次测试:

5 uboot启动Linux内核测试

uboot的最终目的就是启动Linux内核,所以需要通过启动Linux内核来判断uboot移植是否成功。

启动Linux内核。我们测试两种启动Linux内核的方法:

  • 从EMMC启动
  • 从网络启动

从EMMC启动也就是将编译出来的Linux镜像文件zImage设备树文件保存在EMMC中,uboot从EMMC中读这两个文件并启动。
由于我们板子的EMMC中可能还没有linux镜像文件和设备树文件,所以先不测试这种方法。

从网络启动,是指将linux镜像文件和根文件系统都放到Ubuntu下某个指定的文件夹中,然后通过nfs或者tftp等传输方式将系统文件(zImage和设备树文件)从Ubuntu中直接下载到开发板的内存中,EMMC中则不需要有系统文件。这种方式的作用就是方便调试,免去将代码固化到开发板的过程。当然,当开发板掉电,内存的系统文件就没了。

下面就来通过网络调试的方法来测试uboot是否能正常启动Linux内核。

在测试之前,先来介绍一下在ubuntu虚拟机上如何搭建tftp来传输文件

5.1 tftp服务搭建

Ubuntu上搭建TFTP服务器,需要安装tftp-hpatftpd-hpa,命令如下:

sudo apt-get install tftp-hpa tftpd-hpa 
sudo apt-get install xinetd 

TFTP也需要一个文件夹来存放文件,在用户目录下新建一个目录,示例命令如下:

mkdir /home/xxpcb/myTest/tftpdir
chmod 777 /home/xxpcb/myTest/tftpdir

最后配置 tftp, 安装完成以后,新建文件/etc/xinetd.d/tftp, 如果没有/etc/xinetd.d 目录的话自行创建,然后在里面输入如下内容:

server tftp 
{ 
    socket_type    = dgram 
    protocol       = udp 
    wait           = yes 
    user           = root 
    server         = /usr/sbin/in.tftpd 
    server_args    = -s /home/xxpcb/myTest/tftpdir/ 
    disable        = no 
    per_source     = 11 
    cps            = 100 2 
    flags          = IPv4 
}

完了以后启动tftp服务,命令如下:

sudo service tftpd-hpa start 

打开/etc/default/tftpd-hpa文件,将其修改为如下所示内容:

# /etc/default/tftpd-hpa 

TFTP_USERNAME="tftp" 
TFTP_DIRECTORY="/home/xxpcb/myTest/tftpdir"  
TFTP_ADDRESS=":69"                                 
TFTP_OPTIONS="-l -c -s"  

TFTP_DIRECTORY就是我们上面创建的tftp文件夹目录,以后我们就将所有需要通过TFTP传输的文件都放到这个文件夹里面,并且要给予这些文件相应的权限。

最后输入如下命令, 重启 tftp 服务器:

sudo service tftpd-hpa restart

至此,tftp服务器已经搭建好了,可以先来测试一下功能是否正常。

5.2 tftp文件传输测试

测试tftp功能是否正常,主要分为两步:

  • 首先是将某个zImage镜像文件拷贝到ubuntu虚拟机的tftpboot文件夹中,并且给予 zImage 相应777的权限。
  • 然后是通过开发板uboot的串口交互指令将文件从ubuntu传输到开发板的内存

uboot串口交互指令中的tftp命令格式如下:

tftpboot [loadAddress] [[hostIPaddr:]bootfilename]

loadAddress是文件在DRAM中的存放地址,[[hostIPaddr:]bootfilename]是要从Ubuntu中下载的文件。

tftp传输文件,不需要输入文件在Ubuntu中的完整路径,只需要输入文件名即可。

比如我们现在将tftpboot文件夹里面的zImage文件下载到开发板DRAM的0X80800000地址处,命令如下:

tftp 80800000 zImage 

注:此次测试时,我的ubuntu虚拟机(作为tftp服务器)的IP变了,所以我又重新设置了ubuntu的IP

5.3 测试从网络启动Linux

  • 设置环境变量

这两个环境变量的具体含义先不展开讨论。

setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw' 
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-evk-emmc.dtb; bootz 80800000 - 83000000' 
saveenv 

  • 通过tftp将zImage和设备树下载到板子的RAM中

就是通过网路的方式(tftp)将系统文件下载到板子的内存中,这里使用的野火提供的yocto的zImage和dtb文件,将两个文件辅助到ubuntu的tftp服务器目录,依次输入如下指令:

tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-evk-emmc.dtb

  • 启动内核
bootz 80800000 - 83000000

可以看到 Starting kernel … 的字样,表示内核已经启动。

再看看下板子,已经有启动画面了:

在过一会儿,会出现系统的图形界面,只是现在还不能操作,触摸没反应。

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

ed2c5f57321.png)

可以看到 Starting kernel … 的字样,表示内核已经启动。

再看看下板子,已经有启动画面了:

在过一会儿,会出现系统的图形界面,只是现在还不能操作,触摸没反应。

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
[外链图片转存中…(img-iPmQ69Me-1715640089900)]
[外链图片转存中…(img-NjWvgEbM-1715640089900)]

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 21
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值