北沙滩网站建设公司,3d建模师未来发展前景,wordpress xy 变装,wordpress整合ldap文章目录 前言串口乱码问题定位内核修改晶振频率uboot 修改晶振频率番外篇 前言
上篇文章《ARM DIY 硬件调试》介绍了 DIY ARM 板的基础硬件焊接#xff0c;包括电源、SOC、SD 卡座等#xff0c;板子已经可以跑起来了。 但是发现串口乱码#xff0c;今天就来解决串口乱码问… 文章目录 前言串口乱码问题定位内核修改晶振频率uboot 修改晶振频率番外篇 前言
上篇文章《ARM DIY 硬件调试》介绍了 DIY ARM 板的基础硬件焊接包括电源、SOC、SD 卡座等板子已经可以跑起来了。 但是发现串口乱码今天就来解决串口乱码问题。
串口乱码问题定位
串口出现乱码通常是波特率设置的不对仔细检查了下 设备树配置的波特率 chosen {stdout-path serial0:115200n8;};和 xshell 的串口参数 都是 115200配置没有问题。 想到是不是晶振实际频率和配置的不一致。 板子上焊接的是 26MHz设备树中配置的是 24000000这样导致系统时钟不正确最终产生的串口波特率不是 115200所以乱码。
内核修改晶振频率
内核修改晶振频率直接修改上述红框中设备树参数就行了 osc24M: osc24M_clk {#clock-cells 0;compatible fixed-clock;// clock-frequency 24000000;clock-frequency 26000000; // 晶振频率实际为 26MHzclock-accuracy 50000;clock-output-names osc24M;};上电发现内核串口输出已经正常但是 uboot 串口输出还是乱码
Qµ!ݿN¡¬,º¢§ʖʘʛS#⑭®ª¨ J¥*T ¤VնӝջᏎݵ6£¤¤Q¨©#ճ鎖ƘڐʘʛW#⑥ªٴ7䙵Rų䝼w儑 £¥u¡ĭ±셲Re³¢«-*A ƕ#Q¬®KՐIAª9כD:Ѣ#N¥®EA«陝£{A¡cѺ앥CA¶כA¦(Ωº ^Ųݷ¶LɐY½V썐®ͱ-CAµkպ䝵K#Ű¢ن*§³)^Ѡʳ*V隂NNѱa♂QH鞂VJաa⑂2ݐ)[ἭݹC]ҡ±/썐©]ي᳃ٵՁ¦Wݴ#ٹªɹӝ A±-娝·Kþ$þӝŲ/Gѷ;A²º¯7aªA´9;ō¶*sAµ«$麅´VU¢骩)ݷűź#˅¡¢ِº厙Қa£*αUю)ͳ썐ߥ±Ꭼҙښ¢.¯取6ɐ.º厥«#]³ª¨ґ帩ɱªِ²폁²6բ1Uю麩Sɐ¬峩ѿ*ѻ鸷A¹V䍐[A¦A²¸3⑂6¤ɱ{A¤-/7ՐE͵ӝCͱݰύ%傧U ѡz썐]Jٱºن#٠ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 5.3.5 (liyongjunBox) (gcc version 12.3.0 (Buildroot 2023.08-rc1-102-g51dbde549e)) #3 SMP Thu Aug 17 04:19:40 CST 2023
[ 0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr10c5387d
[ 0.000000] CPU: div instructions available: patching division code
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[ 0.000000] OF: fdt: Machine model: Lichee Pi Zero with Dock
[ 0.000000] Memory policy: Data cache writealloc
[ 0.000000] cma: Reserved 16 MiB at 0x41c00000
[ 0.000000] psci: probing for conduit method from DT.
[ 0.000000] psci: Using PSCI v0.1 Function IDs from DT
[ 0.000000] percpu: Embedded 15 pages/cpu s30412 r8192 d22836 u61440
[ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 16256
[ 0.000000] Kernel command line: consolettyS0,115200 panic5 consoletty0 rootwait root/dev/mmcblk0p2 earlyprintk rw
[ 0.000000] Dentry cache hash table entries: 8192 (order: 3, 32768 bytes, linear)
[ 0.000000] Inode-cache hash table entries: 4096 (order: 2, 16384 bytes, linear)
[ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:offuboot 修改晶振频率
那就接着修改 uboot 晶振频率配置同样修改设备树参数 osc24M: osc24M_clk {#clock-cells 0;compatible fixed-clock;// clock-frequency 24000000;clock-frequency 26000000;clock-accuracy 50000;clock-output-names osc24M;};上电发现 uboot 串口打印还是乱码。查看 uboot 编译选项确认 uboot 启用了设备树并且修改的设备树参数也已经被 C 代码解析到了是 26000000不过串口还是乱码。 最终通过修改 .h 文件中的 CONFIG_SYS_NS16550_CLK 参数成功修复了 uboot 串口乱码的问题 ns16550 是很多 SOC 使用的串口芯片 IP。 在上面截图的最后可以看到 #define COUNTER_FREQUENCY 24000000 这个配置这个参数仍然保持 24000000 而 uboot 串口也不会乱码说明 uboot 的串口时钟设置并不像 kernel 那样基于 CPU 时钟而是有自己单独的一个参数 CONFIG_SYS_NS16550_CLK这也解释了为什么一开始配置 uboot 设备树的 CPU 时钟仍然解决不了串口打印乱码的问题。 最终 uboot 和 kernel 的串口打印都正常了
U-Boot SPL 2022.01 (Aug 19 2023 - 23:03:28 0800)
DRAM: 64 MiB
Trying to boot from MMC1U-Boot 2022.01 (Aug 19 2023 - 23:03:28 0800) Allwinner TechnologyCPU: Allwinner V3s (SUN8I 1681)
Model: Lichee Pi Zero
DRAM: 64 MiB
WDT: Not starting watchdog1c20ca0
MMC: mmc1c0f000: 0
Loading Environment from FAT... Unable to read uboot.env from mmc0:1... In: serial1c28000
Out: serial1c28000
Err: serial1c28000
Net: No ethernet found.
Hit any key to stop autoboot: 0
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
Found U-Boot script /boot.scr
292 bytes read in 2 ms (142.6 KiB/s)
## Executing script at 41900000
4183712 bytes read in 349 ms (11.4 MiB/s)
9041 bytes read in 4 ms (2.2 MiB/s)
Kernel image 0x41000000 [ 0x000000 - 0x3fd6a0 ]
## Flattened Device Tree blob at 41800000Booting using the fdt blob at 0x41800000Loading Device Tree to 42dfa000, end 42dff350 ... OKStarting kernel ...[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 5.3.5 (liyongjunBox) (gcc version 12.3.0 (Buildroot 2023.08-rc1-102-g51dbde549e)) #3 SMP Thu Aug 17 04:19:40 CST 2023
[ 0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr10c5387d
[ 0.000000] CPU: div instructions available: patching division code
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[ 0.000000] OF: fdt: Machine model: Lichee Pi Zero with Dock
[ 0.000000] Memory policy: Data cache writealloc
[ 0.000000] cma: Reserved 16 MiB at 0x41c00000
[ 0.000000] psci: probing for conduit method from DT.
[ 0.000000] psci: Using PSCI v0.1 Function IDs from DT
[ 0.000000] percpu: Embedded 15 pages/cpu s30412 r8192 d22836 u61440
[ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 16256
[ 0.000000] Kernel command line: consolettyS0,115200 panic5 consoletty0 rootwait root/dev/mmcblk0p2 earlyprintk rw
[ 0.000000] Dentry cache hash table entries: 8192 (order: 3, 32768 bytes, linear)
[ 0.000000] Inode-cache hash table entries: 4096 (order: 2, 16384 bytes, linear)
[ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
番外篇
在一开始没有找到解决 uboot 串口打印乱码问题办法的时候又想通过 uboot 本身来看出一些端倪怎么办呢我想到了一个办法因为实际晶振频率从 24MHz 变成了 26MHz那么串口波特率就会从 115200 变成115200 / 24 * 26 124800那就把 xshell 的串口波特率设置成 124800 这样串口打印也不乱码了
U-Boot 2022.01 (Aug 19 2023 - 23:03:28 0800) Allwinner TechnologyCPU: Allwinner V3s (SUN8I 1681)
Model: Lichee Pi Zero
DRAM: 64 MiB
WDT: Not starting watchdog1c20ca0
MMC: mmc1c0f000: 0
Loading Environment from FAT... Unable to read uboot.env from mmc0:1... In: serial1c28000
Out: serial1c28000
Err: serial1c28000
Net: No ethernet found.
Hit any key to stop autoboot: 0 printenv
archarm
baudrate115200
boardsunxi
board_namesunxi
boot_a_scriptload ${devtype} ${devnum}:${distro_bootpart} ${scriptaddr} ${prefix}${script}; source ${scriptaddr}
boot_efi_binaryload ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} efi/boot/bootarm.efi; if fdt addr ${fdt_addr_r}; then bootefi ${kernel_addr_r} ${fdt_addr_r};else bootefi ${kernel_addr_r} ${fdtcontroladdr};fi
boot_efi_bootmgrif fdt addr ${fdt_addr_r}; then bootefi bootmgr ${fdt_addr_r};else bootefi bootmgr;fi
boot_extlinuxsysboot ${devtype} ${devnum}:${distro_bootpart} any ${scriptaddr} ${prefix}${boot_syslinux_conf}
boot_prefixes/ /boot/
boot_script_dhcpboot.scr.uimg
boot_scriptsboot.scr.uimg boot.scr
boot_syslinux_confextlinux/extlinux.conf
boot_targetsfel mmc0 pxe dhcp
bootcmdrun distro_bootcmd
bootcmd_dhcpdevtypedhcp; if dhcp ${scriptaddr} ${boot_script_dhcp}; then source ${scriptaddr}; fi;setenv efi_fdtfile ${fdtfile}; if test -z ${fdtfile} -a -n ${soc}; then setenv efi_fdtfile ${soc}-${board}${boardver}.dtb; fi; setenv efi_old_vci ${bootp_vci};setenv efi_old_arch ${bootp_arch};setenv bootp_vci PXEClient:Arch:00010:UNDI:003000;setenv bootp_arch 0xa;if dhcp ${kernel_addr_r}; then tftpboot ${fdt_addr_r} dtb/${efi_fdtfile};if fdt addr ${fdt_addr_r}; then bootefi ${kernel_addr_r} ${fdt_addr_r}; else bootefi ${kernel_addr_r} ${fdtcontroladdr};fi;fi;setenv bootp_vci ${efi_old_vci};setenv bootp_arch ${efi_old_arch};setenv efi_fdtfile;setenv efi_old_arch;setenv efi_old_vci;
bootcmd_felif test -n ${fel_booted} test -n ${fel_scriptaddr}; then echo (FEL boot); source ${fel_scriptaddr}; fi
bootcmd_mmc0devnum0; run mmc_boot
bootcmd_pxedhcp; if pxe get; then pxe boot; fi
bootdelay2
bootm_size0x2e00000
consolettyS0,115200
cpuarmv7
dfu_alt_info_ramkernel ram 0x41000000 0x1000000;fdt ram 0x41800000 0x100000;ramdisk ram 0x41C00000 0x4000000
distro_bootcmdfor target in ${boot_targets}; do run bootcmd_${target}; done
efi_dtb_prefixes/ /dtb/ /dtb/current/
fdt_addr_r0x41800000
fdtcontroladdr43d71610
fdtfilesun8i-v3s-licheepi-zero.dtb
fdtoverlay_addr_r0x41B00000
kernel_addr_r0x41000000
load_efi_dtbload ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}${efi_fdtfile}
loadaddr0x42000000
mmc_bootif mmc dev ${devnum}; then devtypemmc; run scan_dev_for_boot_part; fi
mmc_bootdev0
partitionsnameloader1,start8k,size32k,uuid${uuid_gpt_loader1};nameloader2,size984k,uuid${uuid_gpt_loader2};nameesp,size128M,bootable,uuid${uuid_gpt_esp};namesystem,size-,uuid${uuid_gpt_system};
pxefile_addr_r0x41A00000
ramdisk_addr_r0x41C00000
scan_dev_for_bootecho Scanning ${devtype} ${devnum}:${distro_bootpart}...; for prefix in ${boot_prefixes}; do run scan_dev_for_extlinux; run scan_dev_for_scripts; done;run scan_dev_for_efi;
scan_dev_for_boot_partpart list ${devtype} ${devnum} -bootable devplist; env exists devplist || setenv devplist 1; for distro_bootpart in ${devplist}; do if fstype ${devtype} ${devnum}:${distro_bootpart} bootfstype; then run scan_dev_for_boot; fi; done; setenv devplist
scan_dev_for_efisetenv efi_fdtfile ${fdtfile}; if test -z ${fdtfile} -a -n ${soc}; then setenv efi_fdtfile ${soc}-${board}${boardver}.dtb; fi; for prefix in ${efi_dtb_prefixes}; do if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${efi_fdtfile}; then run load_efi_dtb; fi;done;run boot_efi_bootmgr;if test -e ${devtype} ${devnum}:${distro_bootpart} efi/boot/bootarm.efi; then echo Found EFI removable media binary efi/boot/bootarm.efi; run boot_efi_binary; echo EFI LOAD FAILED: continuing...; fi; setenv efi_fdtfile
scan_dev_for_extlinuxif test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${boot_syslinux_conf}; then echo Found ${prefix}${boot_syslinux_conf}; run boot_extlinux; echo SCRIPT FAILED: continuing...; fi
scan_dev_for_scriptsfor script in ${boot_scripts}; do if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${script}; then echo Found U-Boot script ${prefix}${script}; run boot_a_script; echo SCRIPT FAILED: continuing...; fi; done
scriptaddr0x41900000
serial#12c0000127c26729
socsunxi
stderrserial1c28000
stdinserial1c28000
stdoutserial1c28000
uuid_gpt_espc12a7328-f81f-11d2-ba4b-00a0c93ec93b
uuid_gpt_system69dad710-2ce4-4e3c-b16c-21a1d49abed3Environment size: 4258/131068 bytes然后通过 uboot 的串口打印以及环境变量来找寻更多信息帮助解决问题。