2024年物联网嵌入式最全i(1),轻松拿下offer

img
img

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

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

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


修改为:


![](https://img-blog.csdnimg.cn/img_convert/a9ec05b03d30c4341202610dd832bcf5.png)


#### 2.3.4 修改MAINTAINERS文件


再接着修改 board/freescale/mx6ull\_myboard 目录下的`MAINTAINERS`文件


将原始内容:



MX6ULLEVK BOARD
M: Peng Fan peng.fan@nxp.com
S: Maintained
F: board/freescale/mx6ullevk/
F: include/configs/mx6ullevk.h
F: configs/mx6ull_14x14_evk_defconfig
F: configs/mx6ull_9x9_evk_defconfig


修改为:


![](https://img-blog.csdnimg.cn/img_convert/616ab5d32a7a0476aefa209b5181dfad.png)


#### 2.3.5 重命名板子的c文件


将 board/freescale/mx6ull\_myboard 目录下原来的`mx6ullevk.c`重命名为`mx6ull_myboard.c`


![](https://img-blog.csdnimg.cn/img_convert/a1f39e849b4c90d0c8b4ee84a2ae7a0b.png)


### 2.4 修改U-Boot图形界面配置文件


最后修改`arch/arm/cpu/armv7/mx6/`目录下的`Kconfig`文件



> 
> 注意这里的Kconfig和`board/freescale/mx6ull_myboard`目录下的Kconfig是不一样的。
> 
> 
> 


在207行插入一些内容:



config TARGET_MX6ULL_MYBOARD
bool “Support mx6ull_myboard”
select MX6ULL
select DM
select DM_THERMAL


![](https://img-blog.csdnimg.cn/img_convert/edd3e71d100a35c343b47676a0e42a59.png)


然后,在最后一行的`endif`的前一行添加如下内容:



source “board/freescale/mx6ull_myboard/Kconfig”


![](https://img-blog.csdnimg.cn/img_convert/1a269f95beaef5c6dfe25415c4338135.png)


### 2.5 创建编译脚本


在uboot-imx-rel\_imx\_4.1.15\_2.1.0\_ga目录下新建一个名为`build_myboard.sh`的 shell 脚本,写入如下内容:



make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_myboard_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8


至此,以上完成的工作,相当于将NXP原厂开发板相关的配置文件,重新复制了一份,并对板子名称修改为了自己板子的名字。


此时执行`./build_myboard.sh`,等待编译完成后输入如下命令:



grep -nR “mx6ull_myboard.h”


如果有很多文件都引用了这个头文件, 那就说明新板子添加成功:


![](https://img-blog.csdnimg.cn/img_convert/cb3c1cbed4f372c01af7a58e7991d708.png)


将uboot进行编译并运行,实际的效果应该和原厂uboot的效果一样(LCD无法显示)。


![](https://img-blog.csdnimg.cn/img_convert/3ced4e308f52d8ea730f601dfd708d0f.png)


**总结一下刚才都有哪些修改**:


右端灰色的为原厂开发板的相关文件,黄色的为模仿原厂文件,新添加并修改的自己开发板的文件。


![](https://img-blog.csdnimg.cn/img_convert/cdebdbef0cbeca895ff8e72da554622d.png)


下面进行LCD驱动的修改。


## 3 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 配置参数是否正确


**正点原子**以及**野火**的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)的一些参数如下:




| 参数 | 值 |
| --- | --- |
| 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
} } };


### 3.2 修改h文件配置


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



panel=TFT43AB


修改为:



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


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


### 3.3 编译测试


将修改后的uboot编译下载以后,LCD 驱动一般就会工作正常了,LCD 上会显示 NXP 的 logo。


![](https://img-blog.csdnimg.cn/img_convert/33b84707c0c61f918d6ea1efd91144df.png)


但某些情况有可能还会遇到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虚拟机则也在同一个局域网)。


![](https://img-blog.csdnimg.cn/img_convert/68365991893ea56bfa9eb394a9694b66.png)


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


![](https://img-blog.csdnimg.cn/img_convert/b71b5498fdc387c6dd78dc40556ba374.png)


### 4.2 设置网络参数


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


![](https://img-blog.csdnimg.cn/img_convert/cc48f6004a19d1c292949a460327628a.png)


除了设置开发板的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卡中。


![](https://img-blog.csdnimg.cn/img_convert/29955cc71cb4bd3c4817f0ab0ded4826.png)


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


![](https://img-blog.csdnimg.cn/img_convert/8c628379d877b88e0de5cd345753f724.png)


## 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-hpa`和`tftpd-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
}




![img](https://img-blog.csdnimg.cn/img_convert/5b00111c9e8564f37018d6ab1c4410e5.png)
![img](https://img-blog.csdnimg.cn/img_convert/0be7e5b1b2c5626184427739cf90ac73.png)

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

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

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

      = root 
    server         = /usr/sbin/in.tftpd 
    server_args    = -s /home/xxpcb/myTest/tftpdir/ 
    disable        = no 
    per_source     = 11 
    cps            = 100 2 
    flags          = IPv4 
}

[外链图片转存中…(img-zqqHS2dz-1715649823566)]
[外链图片转存中…(img-UDFkeqVi-1715649823567)]

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

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

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

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值