6.1. 环境类
6.1.1. UBOOT的bootargs怎么设置
通过串口连接,在系统启动时,快速持续按下回车键,进入uboot,然后做如下设置:
当前启动有效
setenv bootargs ${bootargs} <items to add>
长期有效
使用extra_bootargs:
setenv extra_bootargs <itmes to add>;
saveenv
使用custom_bootargs:
setenv custem_bootargs true;
setenv bootargs <customized bootargs>;
saveenv
6.1.2. 如何用fastboot命令行烧录系统镜像
X3开发板进入fastboot模式,板子在uboot下输入
fastboot 0
在PC上烧录系统镜像,拷贝要烧录的系统disk.img到对应目录,在PC端输入
fastboot flash 0x0 disk.img # 整体镜像烧录
fastboot flash uboot uboot.img # 烧录uboot分区
fastboot flash boot boot.img # 烧录boot分区
fastboot flash system system.img # 烧录system分区
6.1.3. 如何在根文件系统修改文件
需要给根文件系统添加读写权限
mount -o rw, remount /
6.2. 系统类
6.2.1. PowerOff 命令会关闭哪些电
poweroff 会去拉en_vdd_core_pd的pin,就看每个项目上,这根pin能控制哪几路电了。按道理需要把group3和group4的电断掉
6.2.2. 如何查看ddr带宽统计
hrut_ddr -t all -p 1000
6.2.3. 如何设置ip且重启后有效
hrut_ipfull s 192.168.1.10 255.255.255.0 192.168.1.1
6.2.4. 如何查看cpu bpu信息统计
hrut_somstatus -n 1000
6.2.5. 如何读取芯片uid命令
cat /sys/class/socinfo/soc_uid
6.2.6. 如何查看bpu支持的频率
cat /sys/class/devfreq/devfreq1/available_frequencies
6.2.7. 如何查看cpu频率模式
cat /sys/devices/system/cpu/cpufreq/policy0/scaling_governor
6.2.8. 如何查看cpu降频温度
cat /sys/devices/virtual/thermal/thermal_zone0/trip_point_1_temp
6.2.9. 关闭cpu核的方法
echo 0 > /sys/devices/system/cpu/cpu2/online
echo 0 > /sys/devices/system/cpu/cpu3/online
6.2.10. 中断绑定cpu核方法
echo 8 > /proc/irq/175/smp_affinity绑定核到core3,echo后的8对应core3,1/2/4/8分别对应core0-3,175是中断号
6.2.11. ion大小查看命令,uboot下修改命令,dts修改ion大小
memstat可以查看ion总大小
cat /sys/kernel/debug/ion/heaps/ion_cma可以查看当前ion使用大小
在uboot下面使用如下命令可以修改ion大小到1G setenv ion_size ‘1024’ saveenv
修改如下截图的dts圈红部分可以修改ion大小
6.2.12. X3 usb规格相关
usb endpoint端点加上ep0总共9个,4对半,除去ep0 7个, 3对半
端点的max packet size大小 ep0in/out 512bytes 其余端点都可以1024 ~ 1032bytes
In 最多6个,Out没限制,是可以配置的,如下几种组合:
6 In + 3 Out
5 In + 4 Out
4 In + 5 Out
3 In + 6 Out
2 In + 7 Out
1 In + 8 Out
目前没做灵活的配置, 修改代码重新初始化
drivers/usb/dwc3/gadget.c
dwc3_gadget_init_endpoints
usb的扩展xu指令能支持多少条,协议里面是16bit,65536,但是usb代码里面有些地方写成了8bit需要改动,改动地方如下截图
6.2.13. usb支持传输模式
usb isoc - 等时,bulk - 批量都支持
usb2.0的最大传输带宽为480Mbps(即60MB/s,x3实际虚拟U盘测试大概是 42~44MBps),usb2.0 bulk传输 大概是42MBps的带宽.
usb2.0 isoc传输 是24MBps的带宽.
usb3.0虚拟磁盘测 373MBps
usb3.0 isoc模式就220MBps左右带宽
usb3.0 bulk 模式375MBps左右
6.2.14. 如何查看和修改系统寄存器
使用devmem命令可以直接访问物理地址读写寄存器,常规用法:
devmem ADDRESS [WIDTH [VALUE]]
6.2.15. i2c命令使用
i2cdetect -l
#用来列举I2C bus和上面所有的设备
i2cdetect -y -r 1
#可以用來差看bus 1上有哪些地址挂载
i2ctransfer -f -y 1 w3@0x36 0x50 0x81 0x01
#0x36为I2C设备的地址, 0x5081为要写的寄存器地址, 0x01为写入的值。
i2ctransfer -f -y 1 w2@0x36 0x30 0x0A r3
#0x36为I2C设备的地址, 0x300A为要读的寄存器地址, r3为连续读3Byte, 0x56 0x08 0x41 为读到的寄存器的值。
6.2.16. X3查看i2s时钟状态
devmem 0xa1000350 (读取i2s0的状态信息,bit20 读到的值是1,表示时钟是disable的状态)
devmem 0xa1000360 (读取i2s1的状态信息,bit20 读到的值是1,表示时钟是disable的状态)
6.2.17. X3 usb host和device切换命令
usb host改成usb device命令
echo device > /sys/devices/platform/soc/b2000000.usb/b2000000.dwc3/role
echo soc:usb-id > /sys/bus/platform/drivers/extcon-usb-gpio/unbind
usb device改成host命令
echo host > /sys/devices/platform/soc/b2000000.usb/b2000000.dwc3/role
6.2.18. X3 ddr和emmc压测命令
测试ddr
echo 4 > /proc/sys/vm/drop_caches
/app/bin/stressapptest -s 172800 -M 100 -f /tmp/sat.io1 -f /tmp/sat.io2 -i 4 -m 8 -C 2 -W > /userdata/ddr.log &
测试emmc性能
/app/bin/iozone -e -I -a -r 4K -r 16K -r 64K -r 256K -r 1M -r 4M -r 16M -s 16K -s 1M -s 16M -s 128M -s 1G -f /userdata/iozone -Rb /userdata/test_iozone_emmc_ext4.xls
6.2.19. 如何使用usb_webcam单元测试程序
驱动请使用 /etc/init.d/usb-gadget.sh 进行加载, /etc/init.d/usb-gadget.sh help 可以查看支持的符合设备种类。
例如常见uvc 及 和uvc组合的各种设备驱动如下:
/etc/init.d/usb-gadget.sh start uvc
#单个uvc设备, 默认bulk模式
/etc/init.d/usb-gadget.sh start uvc-uac2 #uvc + uac2 复合设备
/etc/init.d/usb-gadget.sh start uvc-rndis-uac2
# uvc + uac2 + rndis 复合设备
/etc/init.d/usb-gadget.sh start uvc-ecm-uac2
# uvc + uac2 + ecm 复合设备
加载设备驱动后, 我们xj3 sdb/dvb等开发板中通常会出现一个/dev/video8设备, 然后运行应用程序:
usb_webcam -b -e 2 -t 9 # test pattern, bulk模式
usb_webcam -b -e 5 -t 9 # os8a10, bulk 模式
然后主机端(如PC)运行potplayer, amcap, 相机等各种程序选择合适分辨率播放即可
6.2.20. 如何区分isoc, bulk传输两种类型的uvc程序?
问题1中的程序都为uvc bulk传输的例子
可使用usb-gadget.sh 最后一个参数进行区分。例子如下:
/etc/init.d/usb-gadget.sh start uvc isoc
# 起单个uvc设备, isoc模式
/etc/init.d/usb-gadget.sh start uvc-uac2 isoc
# 起uvc + uac2 复合设备, isoc模式
/etc/init.d/usb-gadget.sh start uvc-rndis-uac2 isoc
# 起uvc+uac2+rndis 复合设备, isoc模式
/etc/init.d/usb-gadget.sh start uvc-ecm-uac2 isoc
# 起uvc+uac2+ecm 复合设备, isoc模式
应用程序使用相应参数如下
usb_webcam -e 2 -m 2 # test pattern, usb2.0 isoc模式
usb_webcam -e 5 -m 2 # os8a10, usb2.0 isoc模式
usb_webcam -e 2 -m 2 -t 10 # test pattern, usb3.0 isoc模式
usb_webcam -e 5 -m 2 -t 10 # test pattern, usb3.0 isoc模式
6.2.21. 常见usb webcam命令行程序
/etc/init.d/usb-gadget.sh start uvc
usb_webcam -e 2 -t 9 -b
# usb2.0/3.0 bulk 模式
/etc/init.d/usb-gadget.sh start uvc isoc
usb_webcam -e 2 -m 2
# usb2.0 isoc 模式
/etc/init.d/usb-gadget.sh start uvc isoc
usb_webcam -e 2 -m 2 -t 10
# usb3.0 isoc 模式
6.2.22. 如何修改uvc摄像头支持的格式和分辨率
目前代码需要修改两处地方, 可在以下两处添加, 删除对应分辨率, 注意需保持匹配。
prebuilts/root_hijack/usb/gadget/usb-gadget.sh 的create_uvc和delete_uvc函数处,
hbre/libhapi/sample/usb/gadget/libguvc/src/uvc_gadget.c处
6.2.23. 如何修改uac设备的音频采样率和频道数
可修改 /etc/init.d/usb-gadget.sh 的create_uac2处,
最终修改/sys/kernel/config/usb_gadget/g_comp/functions/uac2.0中的相关参数。
root@x3dvbx3-samsung2G-2666:/sys/kernel/config/usb_gadget/g_comp/functions/uac2.0# ls -all
drwxr-xr-x 2 root root 0 Jan 1 08:05 .
drwxr-xr-x 3 root root 0 Jan 1 08:05 ..
-rw-r--r-- 1 root root 4096 Jan 1 08:05 c_chmask
-rw-r--r-- 1 root root 4096 Jan 1 08:05 c_srate
-rw-r--r-- 1 root root 4096 Jan 1 08:05 c_ssize
-rw-r--r-- 1 root root 4096 Jan 1 08:05 p_chmask
-rw-r--r-- 1 root root 4096 Jan 1 08:05 p_srate
-rw-r--r-- 1 root root 4096 Jan 1 08:05 p_ssize
-rw-r--r-- 1 root root 4096 Jan 1 08:05 req_number
root@x3dvbx3-samsung2G-2666:/sys/kernel/config/usb_gadget/g_comp/functions/uac2.0# cat p_chmask
3
root@x3dvbx3-samsung2G-2666:/sys/kernel/config/usb_gadget/g_comp/functions/uac2.0# cat p_srate
48000
root@x3dvbx3-samsung2G-2666:/sys/kernel/config/usb_gadget/g_comp/functions/uac2.0# cat p_ssize
2
6.2.24. uvc isoc传输多带宽配置相关
Linux主线代码关于uvc isoc模式只实现了 alt 0 - zero bandwidth, alt 1 - full bandwidth两种带宽配置, 实际成品摄像头通常根据各种分辨率提供不同的带宽配置, 以保证数据负载能相对均匀地分布在usb等时传输的微帧中。以做到名副其实的等时传输。
目前代码已实现了nv12, yuy2, mjpeg三种格式的多带宽配置方案, h264由于本身码率变化更大, 故依然采用了 空/满带宽两种配置方式。
客户如果修改mjpeg的编码质量等参数, 导致相应的带宽配置不匹配, 可以手动修改用户态程序
hbre/libhapi/sample/usb/gadget/libguvc/src/uvc_gadget.c 进行max pakcket size的修改。
注: max_packet_size请参考内核drivers/usb/gadget/function/f_uvc.c中的isoc_max_packet_size值进行修改。如需添加或修改一些其他值, 需内核和用户态程序共同修改。
6.2.25. uvc isoc传输性能方面问题汇总
usb isoc传输是一种注重实时性, 不注重数据完整性的传输协议。 类似udp, isoc传输没有数据出错重传机制。故设备端中断处理, 数据传输等性能方面会影响到isoc传输的数据完整性。 对于h264, mjpeg等压缩数据来说, isoc传输的丢帧策略就会导致图像花屏, 撕裂等现象。
常见的丢数据场景有
系统负载过高, 线程和中断处理繁忙, 导致设备端发数据给usb控制器慢了, dwc3控制器发现数据带的微帧号已经过期了, 则会丢弃该帧数据。报-18 (Missed Isoc)错误。
usb控制器axi总线优先级低, 导致dma从ddr上搬运数据的效率过低, 最终导致数据超时被丢弃。
usb信号质量不行(眼图没过), 导致usb总线上数据出错, 主机端虽然会做crc校验, 但没有重传机制, 导致花屏现象产生。
总结有如下一些方式提高usb模块的性能:
将usb中断单独绑定到其他cpu核心上, 避免都在cpu0上中断竞争。
cat /proc/interrupts
# 找到dwc3的中断号(我的系统中是178)
echo 8 > /proc/interrupts/smp_affinity # 将dwc3的中断绑定在cpu 核心4上
用户态进程绑到其他空闲核心上
ddr qos调整usb模块访问的优先级
cat /sys/bus/platform/drivers/ddr_monitor/write_qos_ctrl/peri
cat /sys/bus/platform/drivers/ddr_monitor/read_qos_ctrl/peri
echo 15 > /sys/bus/platform/drivers/ddr_monitor/write_qos_ctrl/peri
echo 15 > /sys/bus/platform/drivers/ddr_monitor/read_qos_ctrl/peri
调整cpu频率到performance模式
echo performance > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor
调高ddr到更高的稳定频率(比如3200MHz, 4266MHz)
6.2.26. 如何使用uart工具手动一步一步烧写固件
有时使用hbupdate工具升级失败,通过手动uart烧录来获取更多信息,判断错误点,手动uart烧写步骤:
在SDK包的 software_tools/update_tools 目录下找到 entry_uart.py
设备串口和电脑连接起来,设备保持下电
通过SecureCRT连接设备串口,将附件entry_uart.py脚本通过serial中script的run选项选中该脚本,开始运行
运行脚本后,立即将开发板上电,上电后即可进入串口下载模式,在’ C’未打印结束(大概3分钟)时选择Transfer 中’Send Xmodem’模式进行spl固件的下载,可在hbupdate工具中查找,如hbupdate\data\board_config\xj3-key1\boot_config\boot_file\boot_config\spl-uart-secure.bin。
加载并运行完SPL后,自动进入上传加载ddr bin文件的程序,通过serial工具中transfer中的’ Send Ymodem’模式进行上传bin文件,选择正确的bin文件(如update/data/xj3-ddr/SAMSUNG-LPDDR4-3200-110-ddr.bin)。
加载完ddr bin后,自动进入上传加载boot pkg文件程序,通过serial工具中transfer中的’ send Ymodem’模式进行上传boot*.pkg文件,选择正确的pkg文件(如果没有该文件可在hbupdate工具与spl同目录下选择正确的pkg文件)。
正常加载后设备进入uboot ,后续可通过fastboot烧录或手动tftp将镜像上传烧录。
6.3. 视频处理
6.3.1. Version_0807版本SDK QOS配置方法
devmem 0xa1000044 32 0x1010 //pll
devmem 0xa1000144 32 0x11 //sif mclk
devmem 0xa4000038 32 0x10100000 //axibus_ctrl
devmem 0xA2D10000 32 0x04032211 //read_qos_ctrl
devmem 0xA2D10004 32 0x04032211 //write_qos_ctrl
6.3.2. 如何打开VIO各模块主要日志
echo "file vio_group_api.c +p" >/sys/kernel/debug/dynamic_debug/control
echo "file acamera.c +p" > /sys/kernel/debug/dynamic_debug/control
echo "file hobot_dev_sif.c +p" > /sys/kernel/debug/dynamic_debug/control
echo "file hobot_dev_ipu.c +p" >/sys/kernel/debug/dynamic_debug/control
echo "file hobot_dev_pym.c +p" >/sys/kernel/debug/dynamic_debug/control
echo "file system_dwe_api.c +p" >/sys/kernel/debug/dynamic_debug/control
echo "file dwe_subdev.c +p" > /sys/kernel/debug/dynamic_debug/control
6.3.3. 如何打开VIO各模块中断日志
echo "func sif_isr +p" >/sys/kernel/debug/dynamic_debug/control
echo "func acamera_interrupt_handler +p" >/sys/kernel/debug/dynamic_debug/control
echo "func x3_ldc_irq +p" >/sys/kernel/debug/dynamic_debug/control
echo "func ipu_isr +p" >/sys/kernel/debug/dynamic_debug/control
echo "func pym_isr +p" >/sys/kernel/debug/dynamic_debug/control
6.3.4. X3查看sif,isp,ipu,pym,vpu等帧率命令
cat /sys/devices/platform/soc/a4042000.pym/fps (查看pym帧率)
cat /sys/devices/platform/soc/b3000000.isp/fps (查看isp帧率)
cat /sys/devices/platform/soc/a4001000.sif/fps (查看sif帧率)
cat /sys/devices/platform/soc/a4040000.ipu/fps (查看ipu帧率)
cat /sys/devices/platform/soc/a8000000.vpu/fps (查看vpu帧率)
cat /sys/devices/platform/soc/a4010000.gdc0/fps (查看gdc帧率)
6.3.5. 如何查看VIO各模块中断状态
cat /proc/interrupts | egrep "sif|isp|ipu|gdc"
6.4. 外设类
6.4.1. 如何判断sensor硬件连接是否正常
使能mclk
echo 1 > /sys/class/vps/mipi_host1/param/snrclk_en
echo 24000000 > /sys/class/vps/mipi_host1/param/snrclk_freq
echo 1 > /sys/class/vps/mipi_host0/param/snrclk_en
echo 24000000 > /sys/class/vps/mipi_host0/param/snrclk_freq
在sdb开发板上,使用 i2cdetect -r -y 2 探测,探测到的地址 40 是 F37, 1a 是 imx415
6.4.2. ETH phy寄存器读取方法
uboot下可以直接使用mii命令,例如
mii dump
mii read
kernel读取phy寄存器方法
cat /sys/class/net/eth0/phy_reg/phy_reg
然后使用dmesg,即可读取部分phy寄存器
6.5. 硬件类
6.5.1. TF卡接口
X3 SDB提供一路TF Card接口,硬件设计上IO接口电平固定为3V3,因此无法支持TF 1.8V高速传输模式。
6.5.2. X3 电源上电斜率要求
X3 对上电斜率有要求,硬件需要实际进行测试。具体要求见Hardware-Design Guide中 1.1.4 Power-On and Power-OFF sequences 表格中的MAX Ramp Rate。当实际硬件测试不满足设计时,可以加MOS软启动电路进行解决。
6.5.3. X3 上掉电时序要求
X3对上掉电时序要求参考Hardware-Design Guide中 1.1.4 Power-On and Power-OFF sequences 掉电时序不能满足设计要求的话,可以不做控制。时序中需要特别注意如下问题: DDR对上掉电时序是由要求的,不符合要求会导致DDR异常,设计需要将DDR的时序考虑在内 LPDDR4的时序要求:VDD_1V8先于VDD_DDR_1V1上电,VDD_DDR_1V1先于VDD_1V8掉电(详细见DDR的规格书)
6.5.4. LPDDR4&DDR4选型优缺点,更推荐使用LPDDR4
DDR4的方案需要用两颗,成本会有一定优化,优化空间不是很大。
LPDDR4的带宽比较有优势能支持3200Mbs。DDR4基本支持2666Mbs以下。
从容量设计角度LPDDR4可以支持pin2pin替代,增加了设计冗余。
6.5.5. USB ID:硬件配置USB主从模式
引脚号AA13 USB_ID芯片端已NC,此引脚NC不连接。硬件引脚已变更为引脚号C12 SD0_WPROT SD0_WPROT上拉4.7K至1V8 X3做device,下拉4.7K至地 X3做host。
6.5.6. USB_VBUS引脚,插拔检测
引脚号 Y14 USB_VBUS 芯片端已NC,此引脚NC不连接。需要另取一个IO脚做USB_VBUS的检测。
X3 USB做host时,不需要USB_VBUS检测,支持热拔插。
X3 USB做device时,需要增加一个IO做USB_VBUS检测,已支持热拔插。
6.5.7. UART串口数量少
可以通过spi转uart的方式扩展。
6.5.8. 最小系统整体运行、待机功耗测试
deepsleep场景下, X3功耗能控制在74mW以内。
静态场景下,在kernel启动时,X3功耗在800mW。
6.5.9. X3 ADC引脚数目
目前仅有一个,如需要多个ADC引脚,需增加外设芯片。
6.6. 工具类
6.6.1. 升级失败-No space left on device
报错信息: “ No space left on device”
解决方法:请检查安装升级工具的分区磁盘空间是否不足
6.6.2. 升级失败-芯片串口被占用
报错信息:如图所示。
解决方法:检查是否有其他程序(MobaXterm、SecureCRT、XShell等软件)已经打开了串口,请关闭掉他们的连接。