《13.uboot杂记-logo显示和fastboot原理等》

本文深入探讨了U-Boot在X210开发板上的LCD操作,包括分辨率适配和logo显示,并详细解析了Fastboot的工作原理及其实现代码,涵盖了从基本概念到具体命令响应的全面内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自 https://edu.csdn.net/lecturer/505 朱老师物联网大讲堂
《13.uboot杂记-logo显示和fastboot原理等》

第一部分、章节目录
2.13.1.X210的uboot中LCD操作分析
2.13.2.logo显示和LCD屏幕分辨率适配
2.13.3.fastboot的基本分析
2.13.4.uboot的fastboot代码分析1
2.13.5.uboot的fastboot代码分析2

第二部分、章节介绍
2.13.1.X210的uboot中LCD操作分析
本节分析在X210的uboot中LCD是如何被操作的,包括分析核心板、底板和LCD模组的原理图、uboot中的相关代码等。
2.13.2.logo显示和LCD屏幕分辨率适配
本节首先讲解如何修改代码让uboot在新版X210BV3S中正常显示logo,然后顺带分析下logo显示部分的代码。
2.13.3.fastboot的基本分析
本节简要描述了fastboot的功能和工作原理,目的是让大家对fastboot有一个宏观和直觉上的认识。
2.13.4.uboot的fastboot代码分析1
本节开始分析fastboot的实现代码,从do_fastboot函数入手一路顺藤摸瓜分析到rx_handler函数。
2.13.5.uboot的fastboot代码分析2
本节继续分析fastboot的实现代码,主要是fastboot从机和主机之间通过的各种命令集及其实现,通过分析让大家从本质上理解fastboot是如何工作的。

第三部分、随堂记录
2.13.1.X210的uboot中LCD操作分析
2.13.1.1、新旧版本开发板的LCD模组差异
(1)2015.11月初之前购买的X210开发板都属于老版本,型号是X210V3;之后购买的开发板都是新版本的,型号是X210V3S。
(2)两个开发板主要电路是完全一样的,不同主要有3点:一个是把拨码开关换成了短路帽;另一个是LCD分辨率从800480升级成1024600;第三个是触摸屏芯片型号换了。

2.13.1.2、背光电路分析
(1)LCD的背光源有2种设计。一种是简单设计,背光只能点亮和熄灭两种状态,不能调亮度;另一种设计类似手机屏幕可以调节亮度。第一种设计很简单,就是开和关。第二种模式比较复杂,需要一个额外的PWM调光IC来支持,X210的LCD模组上使用MP3202芯片来做调光。
(2)分析原理图和MP3202的数据手册,可以得出结论:
第一:PWMTOUT0(GPD0_0)接在了IC的FB引脚上,SoC应该通过该引脚输出一个频率合适的PWM波形给调光IC,这个波形的占空比就会控制MP3202输出的电流大小,从而控制屏幕亮度。
第二:L_DISP(DISP、SYS_OE、GPF3_5)接在了MP3202的EN引脚上,SoC应该给该引脚一个高电平来让背光工作,或者给一个低电平来让背光不工作。
(3)综合分析:背光要点亮,要同时满足以上两个条件。GPD0_0要输出低电平或者PWM信号,同时GPF3_5要输出一个高电平。一般来说我们在uboot中都把GPD0_0设置成输出模式然后输出低电平来点亮背光。

2.13.1.3、X210的uboot中LCD代码分析
(1)在uboot-jiuding/board.c中init_sequence中的display_banner中的open_backlight函数中给GPF3_5输出高电平。但是这个其实是可以省略的,注释掉这一句uboot的LCD显示照样正常的,主要原因是后面LCD操作的部分还会再做一遍的。
(2)真正的初始化LCD系统并且显示logo是在start_armboot函数的后段的x210_preboot_init中。这个函数纯粹是九鼎在移植时添加的。如果我们自己移植uboot可以考虑自己去添加。

2.13.2.logo显示和LCD屏幕分辨率适配
2.13.2.1、LCD驱动mpadfb.c分析
(1)fb_init函数给framebuffer相关的数据结构赋值。左值的info是一个结构体,这个结构体描述fb驱动中的硬件设备参数的,右值的lcd是自己定义的一个数据结构,里面的值都是我们人为配置给驱动体系的。
(2)lcd_port_init看名字是lcd端口的初始化,端口就是GPIO,所以这个函数是在初始化LCD相关的SoC的引脚。
(3)lcd_reg_init看名字是LCD的寄存器的初始化,就是SoC的LCD控制器中的那些寄存器的初始化。
(4)以上三个函数调用执行完后,LCD初始化就结束了。然后向LCD写东西就能显示了。但是你要注意背光是否被点亮了。后面剩下的事情就是写东西和开背光两个了。
(5)display_logo(&s5pv210_fb);这个函数负责把logo图片写到LCD的fb中去。backlight_brigness_init(1);负责开背光。

2.13.2.2、解决新版开发板X210BV3S的logo显示问题
(1)用旧版本的uboot.bin下载到新版开发板中,发现能工作,但是屏幕logo显示不正常(屏幕下面有一条显示不正常的,然后logo是显示出来的但是不在屏幕正中间)。
(2)原因分析:主要原因新版开发板LCD屏幕的分辨率是1024600而旧版分辨率是800480.所以旧版本的uboot在新版开发板上运行时,就会造成屏幕填充不满(现象就是下面有一排显示不正常的),还会造成显示内容位置偏移,本来在中间结果偏左了。
(3)解决方案:很简单,在uboot中将LCD的参数部分,分辨率改成1024*600即可。

2.13.2.3、logo显示代码分析
(1)logo是以工具将图片做成二进制的字符串数据。
(2)显示时通过计算将logo代表的矩形放在屏幕正中央
(3)绘图时先绘制背景色,然后在logo矩形中写入logo图片内容即可。

2.13.3.fastboot的基本分析
2.13.3.1、什么是fastboot
(1)fastboot是android使用的一种刷机方法.android系统设计了2种刷机方式:fastboot和recovery。
(2)fastboot使用usb作为物理传输。刷机其实就是镜像传输+烧录,fastboot刷机时就是通过usb线来传输镜像的。
(3)fastboot是uboot中的一个命令。uboot进入命令行中后,如果需要刷机,则可以在命令行执行fastboot命令就可以让uboot进入fastboot模式,刷机就是在fastboot模式下进行的。
(4)fastboot需要主机端的fastboot软件配合。要实现fastboot刷机,只有开发板端uboot是不行的,还需要在主机上有fastboot.exe的软件配合。
(5)fastboot在开发板和主机间定义了一套协议。其实fastboot是我们在开发板和主机之间定义的一套协议,这套协议以usb为底层传输物理层,协议规定了主机fastboot软件和开发板fastboot软件之间的信息传输规则。消息传递可以实现功能有:主机可以向开发板发送命令、开发板可以向主机发送回复、主机可以向开发板发送文件(download)

2.13.3.2、fastboot的工作原理
(1)uboot的fastboot命令将开发板伪装成一个usb从设备。开发板本身并不是一个usb设备,所以开发板直接插到电脑上电脑是没有反应,没有提示发现设备需要装驱动的。伪装之后开发板就被主机windows识别成一个安卓手机了。
(2)主机的fastboot软件和开发板的fastboot程序通信来工作。平时工作时,开发板端只要执行了fastboot命令进入fastboot模式即可,剩下的就不用管了。主机端通过运行fastboot命令,传递不同的参数来实现主机端和开发板端的通信。
譬如主机端执行fastboot devices,则这个命令通过USB线被传递到开发板中被开发板的fastboot程序接收,接收后去处理然后向主机端发送反馈信息,主机端接收到反馈信息后显示出来。
(3)我们学习fastboot时分析代码的思路就是:
主机端:fastboot.exe的源代码没有,fastboot协议虽然能找到但是很枯燥,所以主机端没有去分析的。
开发板端:主要分析点就是uboot如何进入fastboot模式,fastboot模式下如何响应主机发送的各种命令。

2.13.4.uboot的fastboot代码分析1
2.13.4.1、do_fastboot函数
(1)do_fastboot函数本身涉及到很多操作SD/Nand等磁盘的,主要目的是为了刷机。要完整的分析fastboot的函数细节很复杂很麻烦,我们并不是要做这个。

2.13.4.2、关键点:rx_handler(顺藤摸瓜一路找下去)
do_fastboot
fastboot_poll
fboot_usb_int_hndlr
fboot_usb_pkt_receive
fboot_usb_int_bulkout
fastboot_interface->rx_handler(函数指针)
指向cmd_fastboot.c/rx_handler
找的过程涉及到USB物理层通信的一些概念和理解,相对比较复杂。最终uboot这边的fastboot是通过rx_handler函数来处理主机端fastboot软件发送过来的信息的。fastboot协议的命令实现都在这个函数中提现。所以这个函数的分析就是重点。

2.13.4.3、代码分析
(1)大文件download机制
rx_handler函数中通过if和else分成了两部分,if部分负责处理download,else部分负责处理命令。usb传输单次传输最大只能有限个字节(64、256),因此当我们发送比较小的东西(譬如命令)时可以单次传输完毕;当我们发送比较大的东西(譬如文件)时就必须要分包发送。

(2)down后的响应机制。开发板端通过fastboot_tx_status函数向主机发送响应,主机显示这个响应。

2.13.5.uboot的fastboot代码分析2
(1)uboot中fastboot有关的一些宏定义设置值
CFG_FASTBOOT_TRANSFER_BUFFER 配置fastboot工作时的缓冲区地址,fastboot在执行某些功能时需要大块内存做缓冲区(譬如download时),这里就是在给他配置缓冲区。
CFG_FASTBOOT_TRANSFER_BUFFER_SIZE fastboot缓冲区的大小。
注意:很多同学在之前刷机时,烧录uboot和zImage都正常,但是烧录android镜像x210.img时错误,提示:image too large…(意思是文件太大)。这个错误的原因就是x210.img太大了,超出了CFG_FASTBOOT_TRANSFER_BUFFER_SIZE所以放不下了,所以uboot的fastboot这里报错了。

2.13.5.1、fastboot命令响应之:fastboot reboot
(1)作用:在PC机这边可以远程重启开发板
2.13.5.2、fastboot命令响应之:fastboot getvar
(1)作用是得到一些fastboot中定义的变量名的值,譬如version、product。。。。。
2.13.5.3、fastboot命令响应之:fastboot erase
2.13.5.4、fastboot命令响应之:fastboot download
2.13.5.5、fastboot命令响应之:fastboot boot
2.13.5.6、fastboot命令响应之:fastboot flash
2.13.5.7、fastboot命令响应之:fastboot oem
(1)oem命令是用户自定义的。其他命令全都是fastboot协议定义的,但是有时候自带的命令不足以使用,oem厂商可能希望定义一些自己专有的命令,则可以使用oem命令。

<think>好的,我现在需要帮用户优化一个Shell脚本,使其支持addremove参数。用户提供的原始脚本分为两个部分:添加移除uboot相关文件。用户希望将其改造成带参数的脚本,通过参数控制执行添加或移除操作。 首先,我需要理解原始脚本的功能。添加部分是将一些自定义的脚本配置文件复制到uboot的源码目录中,而移除部分则是删除这些文件,并恢复原始的Makefile。看起来用户可能在开发或定制uboot时,需要频繁地切换这些文件,可能是为了测试不同的配置或维护多个版本。 接下来,我需要考虑如何将这两个部分转化为带参数的脚本。通常,Shell脚本可以通过位置参数(如$1)来接收参数,例如使用add或remove作为参数。因此,脚本应该检查第一个参数,决定执行添加还是移除操作。 在优化过程中,需要注意以下几点: 1. **参数处理**:脚本需要接受add或remove作为参数,并可能提供帮助信息。如果参数不正确,应该提示用法。 2. **函数化**:将添加移除的逻辑封装成函数,提高代码的可读性可维护性。 3. **错误处理**:在复制或删除文件时,检查操作是否成功,例如使用cprm的返回状态,并在失败时给出提示。 4. **路径处理**:确保所有文件路径正确,特别是相对路径的使用。可能需要使用绝对路径或基于脚本所在目录的路径,避免执行脚本时路径错误。 5. **恢复原始Makefile**:在移除操作中,用户不仅删除了自定义文件,还复制了origin目录下的Makefile回去。需要确保这个origin目录的位置正确,并且在复制时不会出错。 6. **可扩展性**:如果以后需要添加更多的文件或操作,脚本应该容易修改。 现在,我需要考虑用户可能的深层需求。用户可能希望简化部署流程,通过脚本快速切换不同的uboot配置,减少手动操作带来的错误。此外,用户可能希望脚本具备一定的健壮性,比如在文件不存在时不会报错,或者能够提示用户具体的错误原因。 在编写函数时,可以为addremove分别创建函数。在add函数中,逐一复制文件,并在每一步检查是否成功。如果某个文件复制失败,可以输出错误信息并退出,或者继续执行但提示警告。同样,在remove函数中,删除文件时如果文件不存在,可能需要忽略错误,或者提示用户。 关于路径问题,原始脚本中的路径使用了相对路径,比如../uboot-master/,这依赖于脚本执行的位置。如果用户在其他目录执行脚本,可能会导致路径错误。因此,可能需要使用脚本所在的目录作为基准,或者要求用户在特定目录下执行脚本。不过,考虑到用户提供的原始脚本使用的是相对路径,可能在他们的工作流程中已经固定了目录结构,因此暂时保持相对路径,但可以在脚本中添加注释,提醒用户需要在正确的目录下运行。 另一个需要注意的点是,在移除操作中,用户不仅删除了自定义文件,还恢复了原始的Makefile。这里的cp命令是从./uboot/origin/Makefile复制到目标位置。需要确保./uboot/origin/Makefile存在,否则会导致错误。在脚本中应该检查这个文件是否存在,如果不存在则报错。 此外,为了提高脚本的友好性,可以添加帮助信息,当用户输入无效参数或使用-h/--help时显示用法。 总结步骤: 1. 解析参数,判断是add、remove还是其他。 2. 定义addremove函数,分别处理文件复制删除。 3. 在函数中添加错误检查,确保每一步操作成功。 4. 处理路径问题,确保文件在正确的位置。 5. 添加帮助信息错误处理,提升脚本的健壮性。</think>以下是优化后的脚本,支持通过`add``remove`参数控制文件操作: --- ```bash #!/bin/bash # 定义路径变量(根据实际路径调整) UBOOT_DIR="../uboot-master" DTS_MAKEFILE_ORIGIN="./uboot/origin/Makefile" # 添加文件的函数 add_files() { echo "添加 U-Boot 相关文件..." # 复制构建脚本 cp -v ./build/54_build.sh ../ || { echo "复制 54_build.sh 失败"; exit 1; } # 复制 U-Boot 脚本配置 cp -v ./uboot/54_make_clean_uboot.sh $UBOOT_DIR/ || exit 1 cp -v ./uboot/54_make_uboot.sh $UBOOT_DIR/ || exit 1 cp -v ./uboot/54_evb_defconfig $UBOOT_DIR/configs/ || exit 1 cp -v ./uboot/54_evb.h $UBOOT_DIR/include/configs/ || exit 1 cp -v ./uboot/54-evb.dts $UBOOT_DIR/arch/arm/dts/ || exit 1 cp -v ./uboot/Makefile $UBOOT_DIR/arch/arm/dts/Makefile || exit 1 echo "✅ 文件添加完成" } # 移除文件的函数 remove_files() { echo "移除 U-Boot 相关文件..." # 删除构建脚本 rm -vf ../54_build.sh # 删除 U-Boot 脚本配置 rm -vf $UBOOT_DIR/54_make_clean_uboot.sh rm -vf $UBOOT_DIR/54_make_uboot.sh rm -vf $UBOOT_DIR/configs/54_evb_defconfig rm -vf $UBOOT_DIR/include/configs/54_evb.h rm -vf $UBOOT_DIR/arch/arm/dts/54-evb.dts # 恢复原始 Makefile if [ -f "$DTS_MAKEFILE_ORIGIN" ]; then cp -v $DTS_MAKEFILE_ORIGIN $UBOOT_DIR/arch/arm/dts/Makefile || exit 1 else echo "❌ 原始 Makefile 不存在: $DTS_MAKEFILE_ORIGIN" exit 1 fi echo "✅ 文件移除完成" } # 参数处理 case "$1" in "add") add_files ;; "remove") remove_files ;; *) echo "用法: $0 [add|remove]" echo " add - 添加 U-Boot 定制文件" echo " remove - 移除 U-Boot 定制文件并恢复原始配置" exit 1 ;; esac ``` --- ### **优化说明** 1. **参数化操作**: - 通过`add``remove`参数控制文件操作,避免手动注释代码。 - 示例用法: ```bash ./script.sh add # 添加文件 ./script.sh remove # 移除文件 ``` 2. **错误处理**: - 使用 `|| exit 1` 确保单步失败时脚本立即退出。 - 检查原始 Makefile 是否存在,避免无效覆盖。 3. **路径集中管理**: - 定义 `UBOOT_DIR` `DTS_MAKEFILE_ORIGIN` 变量,便于批量修改路径。 4. **友好输出**: - 添加 `-v` 参数显示操作详情(如 `cp -v`、`rm -v`)。 - 使用 ✅/❌ 符号标识操作结果。 --- ### **使用注意事项** 1. **权限问题**: - 若提示权限不足,运行前添加执行权限: ```bash chmod +x script.sh ``` 2. **路径验证**: - 确保 `UBOOT_DIR` `DTS_MAKEFILE_ORIGIN` 与实际路径匹配。 3. **日志记录**: - 可将关键操作重定向到日志文件: ```bash ./script.sh add > setup.log 2>&1 ``` 此脚本通过模块化设计提高了可维护性,同时降低了误操作风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值