SSD_UsbCam环境搭建
1. 编译环境搭建¶
通常我们会以交叉编译的方式进行开发和调试,即“宿主机+目标机”的形式。而宿主机和目标机的连接我们一般采用串口连接或网络连接,如下图所示:
注:
-
Sigmastar的debug tool作用除了可以debug外,还可以通过PC工具读寄存器和烧写空flash。
-
如果仅调试,可以使用串口设备正确对接调试线序即可(con3),线序请和原理图对齐。
-
如果要读Register或者烧录裸Flash,需要使用debug Tool。
-
tool根据需求量自行购买。点击购买。
2. 安装Linux Build Code服务器¶
推荐使用Ubuntu 16.04,该版本已进行验证,如果使用其他版本遇到环境问题将不予支持。
2.1. 安装ubuntu 16.04 server¶
-
安装VMware Worksation;
-
选择1604的iso,装载然后安装即可;
-
简易安装直接点击完成,系统会自动进行安装;
-
安装VMtools,用于拷贝windows目录,共享到ubuntu,点击获取参考信息。
ubuntu至此安装成功,接下来安装开发需要的环境。
2.2. 添加新用户¶
-
设置密码
新装的ubuntu首先需要设置root密码。进入系统设置root密码:
# sudo passwd
,连续输入密码直到提示成功; -
添加用户
进入系统后重新创建用户,使用命令
# sudo adduser xxx --force
创建用户,此时会提示输入account的一些信息,一直回车即可; -
安装相关的工具以及编译环境
此时账户已经建立,需要安装相关的工具以及编译环境,执行
# sudo apt-get install libncurses5-dev libncursesw5-dev
,这时候会提示当前用户无法执行sudoers,需要做如下修改:sudo chmod u+w /etc/sudoers vi /etc/sudoers
参考:
root ALL=(ALL:ALL) ALL
, 添加一行:xxx ALL=(ALL:ALL) ALL
sudo chmod u-w /etc/sudoers
再执行sudo操作即可安装了,建议在安装完后执行
#sudo apt-get update
来更新源。
2.3. 安装samba¶
samba用于共享linux文件到windows。
# sudo apt-get install samba samba-common # sudo smbpasswd -a xxx (添加samba账户,用于windows访问linux samba目录)
修改/etc/samba/smb.conf:
[xxx] path=/home/xxx public=yes writable=yes valid users=xxx available=yes browseable=yes guest ok = yes
这样samba已经配置好了,重启samba 服务即可,测试从windows访问samba:\\192.168.1.11 (your ubuntu ip)
2.4. 安装ssh¶
安装ssh用于登陆调试。
sudo apt-get install openssh-server;
安装结束即可使用。
2.5. 其他工具¶
为避免SDK编译失败,需要安装一些工具。
# sudo apt-get install libc6-dev-i386 # sudo apt-get install lib32z1 lib32ncurses5 # sudo apt-get install libuuid1:i386 # sudo apt-get install cmake # sudo apt-get install libncurses5-dev libncursesw5-dev # sudo apt install bc # sudo apt-get install xz-utils # sudo apt-get install automake # sudo apt-get install libtool # sudo apt-get install libevdev-dev # sudo apt-get install pkg-config
如上这些需要安装的tool && lib是必须的,因为编译过程中会用到相关内容。这边就不一一说明是哪个错误,可以尝试先不安装编译来查看相关错误,为了省事,在编译之前一次性安装即可。
2.6. 修改sh¶
如果默认是sh,需要将sh改成 bash 。
# sudo rm /bin/sh # sudo ln –s /bin/bash /bin/sh
2.7. 安装toolchain¶
-
拷贝
gcc-sigmastar-9.1.0-2020.07-x86_64_arm-linux-gnueabihf.tar.xz
到/tools/toolchain/
,自定义目录。 -
解压toolchain
-
将toolchain设置到环境变量中,避免每次手动export;
-
在/etc/profile添加:
export PATH=/tools/toolchain/gcc-sigmastar-9.1.0-2020.07-x86_64_arm -linux-gnueabihf/bin/:$PATH
uclibc 将arm-sigmastar-linux-uclibcgnueabihf-9.1.0.tar.gz解压后如上同样的方法配置即可。
配置完成后,可以按照如下方式确认gcc版本是否已经切换到9.1.0版本。
至此编译环境就已经全部搭建完成了,下面进行sdk的编译工作。
3. SDK开发包编译步骤¶
3.1. 代码获取¶
可从FTP获取对应的SDK开发包。
3.2. 编译boot¶
Toolchain: gcc-sigmastar-9.1.0-2020.07-x86_64_arm-linux-gnueabihf
ufu设置:
-
选择配置
Spinor:
# make pioneer3_defconfig
Spinand:
# make pioneer3_spinand_defconfig
-
u-boot 开启 ufu command
# make menuconfig
进入如下界面:
注意:如果选择 Auto run ufu command in boot,那么 u-boot 就会启动跑进 ufu 停住,等待升级。 此项用在空片升级才需要选,正常情况是不需要选上,否则会进不到 kernel。
Spi Nor Flash
glibc: # declare -x ARCH="arm";declare -x CROSS_COMPILE=" arm-linux-gnueabihf-" # make pioneer3_defconfig; # make clean;make
编译完成后生成的image在: boot/u-boot.xz.img.bin,把它替换到project/board/p3/boot-rtos/nor/uboot,重新编译project即可。
Spi Nand Flash
glibc: # declare -x ARCH="arm";declare -x CROSS_COMPILE=" arm-linux-gnueabihf-" # make pioneer3_spinand_defconfig; # make clean;make
编译完成后生成的image在: boot/u-boot_spinand.xz.img.bin,把它替换到project/board/p3/boot-rtos/spinand/uboot,重新编译project即可。
3.3. 编译kernel¶
编译alkaid会默认编译kernel,和SSD201/SSD202不同。因此建议修改相关kernel之后,直接在project下编译,会默认编译kernel的内容,并且不需要手动release到project下的路径。
step1: 设置编译环境
#declare -x ARCH="arm" 或者采用 export ARCH=arm #declare -x CROSS_COMPILE="arm-linux-gnueabihf-" 或者采用 export CROSS_COMPILE=arm-linux-gnueabihf-
step2: 选取合适config
Chip | Packaging | Memory | Flash Type | Toolchain | UVC & UAC | Defconfig | |
---|---|---|---|---|---|---|---|
SSC9211 | QFN68 | 64M | SPI-NAND | glibc | NA | pioneer3_ssc021a_s01a_spinand_qfn68_usbcam_defconfig | |
SSC9211 | QFN68 | 64M | SPI-NOR | glibc | NA | pioneer3_ssc021a_s01a_qfn68_demo_usbcam_fastboot_defconfig //Fastboot | |
SSD222 | QFN128 | 64M | SPI-NOR | glibc | Single UVC | pioneer3_ssc020a_s01a_qfn128_demo_usbcam_uvc_defconfig | |
SSD222 | QFN128 | 64M | SPI-NOR | glibc | Single UVC + UAC | pioneer3_ssc020a_s01a_qfn128_demo_usbcam_uvc_uac_defconfig | |
SSD222 | QFN128 | 64M | SPI-NOR | glibc | Dual UVC | pioneer3_ssc020a_s01a_qfn128_demo_usbcam_dual_uvc_defconfig | |
SSD222 | QFN128 | 64M | SPI-NOR | glibc | Dual UVC + UAC | pioneer3_ssc020a_s01a_qfn128_demo_usbcam_dual_uvc_uac_defconfig | |
SSD222 | QFN128 | 64M | SPI-NAND | glibc | Single UVC | pioneer3_ssc020a_s01a_qfn128_spinand_demo_usbcam_dual_uvc_uac_fastboot_defconfig //Fastboot | |
SSD222 | QFN128 | 64M | SPI-NAND | glibc | Single UVC | pioneer3_ssc020a_s01a_qfn128_spinand_demo_usbcam_uvc_defconfig | |
SSD222 | QFN128 | 64M | SPI-NAND | glibc | Single UVC + UAC | pioneer3_ssc020a_s01a_qfn128_spinand_demo_usbcam_uvc_uac_defconfig | |
SSD222 | QFN128 | 64M | SPI-NAND | glibc | Dual UVC | pioneer3_ssc020a_s01a_qfn128_spinand_demo_usbcam_dual_uvc_defconfig | |
SSD222 | QFN128 | 64M | SPI-NAND | glibc | Dual UVC + UAC | pioneer3_ssc020a_s01a_qfn128_spinand_demo_usbcam_dual_uvc_uac_defconfig |
step3: clean并编译
# make clean # make -j8
如果kernel 有新增kernel modules需要将相应的module添加到kernel_mod_list/kernel_mod_list_late
(kernel_mod_list_late里的ko会在mi module之后装载)
修改路径:project/kbuild/customize/$(KERNEL_VERSION)/$(CHIP)/$(PRODUCT)/kernel_mod_list
3.4. 编译SDK¶
默认编译sdk时,会先build kernel
,第一次编译通过make clean;make image -j8
命令全部编译,后续如果不需要build kernel
可以用make image-fast
代替make image
。
step1: 设置编译环境
#declare -x ARCH="arm" 或者采用 export ARCH=arm #declare -x CROSS_COMPILE="arm-linux-gnueabihf-" 或者采用 export CROSS_COMPILE=arm-linux-gnueabihf-
step2: 选取合适config
Chip | Packaging | Memory | Flash Type | Toolchain | uvc & uac | Defconfig |
---|---|---|---|---|---|---|
SSC9211 | QFN68 | 64M | SPI-NAND | glibc | NA | make usbcam_p3_spinand.glibc-9.1.0-squashfs.s01a.64.qfn68_defconfig |
SSC9211 | QFN68 | 64M | SPI-NOR | glibc | Single UVC | make usbcam_p3_nor.glibc-9.1.0-ramfs.s01a.64.qfn68.demo_defconfig //Fastboot |
SSD222 | QFN128 | 64M | SPI-NOR | glibc | Single UVC | make usbcam_p3_nor.glibc-9.1.0-squashfs.s01a.64.qfn128.uvc_demo_defconfig |
SSD222 | QFN128 | 64M | SPI-NOR | glibc | Single UVC + UAC | make usbcam_p3_nor.glibc-9.1.0-squashfs.s01a.64.qfn128.uvc_uac_demo_defconfig |
SSD222 | QFN128 | 128M | SPI-NOR | glibc | Dual UVC | make usbcam_p3_nor.glibc-9.1.0-squashfs.s01a.64.qfn128.dual_uvc_demo_defconfig |
SSD222 | QFN128 | 128M | SPI-NOR | glibc | Dual UVC + UAC | make usbcam_p3_nor.glibc-9.1.0-squashfs.s01a.64.qfn128.dual_uvc_uac_demo_defconfig |
SSD222 | QFN128 | 64M | SPI-NAND | glibc | Signal UVC | make usbcam_p3_spinand.glibc-9.1.0-ramfs.s01a.64.qfn128.uvc_demo_defconfig//Fastboot |
SSD222 | QFN128 | 64M | SPI-NAND | glibc | Single UVC | make usbcam_p3_spinand.glibc-9.1.0-squashfs.s01a.64.qfn128.uvc_demo_defconfig |
SSD222 | QFN128 | 64M | SPI-NAND | glibc | Single UVC + UAC | make usbcam_p3_spinand.glibc-9.1.0-squashfs.s01a.64.qfn128.uvc_uac_demo_defconfig |
SSD222 | QFN128 | 128M | SPI-NAND | glibc | Dual UVC | make usbcam_p3_spinand.glibc-9.1.0-squashfs.s01a.64.qfn128.dual_uvc_demo_defconfig |
SSD222 | QFN128 | 128M | SPI-NAND | glibc | Dual UVC + UAC | make usbcam_p3_spinand.glibc-9.1.0-squashfs.s01a.64.qfn128.dual_uvc_uac_demo_defconfig |
3.5. Demo运行参数及Ko参数配置¶
Uvc & Uac | KO List | KO Para | App Para |
---|---|---|---|
Single UVC | kernel_mod_list | insmod /config/modules/4.9.84/usb_f_uvc.ko insmod /config/modules/4.9.84/g_webcam.ko streaming_maxpacket=3072 streaming_maxburst=13 uac_function_enable=0 | ./prog_uvc |
Single UVC + UAC | kernel_mod_list_uvc_uac | insmod /config/modules/4.9.84/usb_f_uvc.ko interrupt_ep_enable=0 insmod /config/modules/4.9.84/g_webcam.ko streaming_maxpacket=3072 streaming_maxburst=13 uac_function_enable=2 p_srate=16000 | ./prog_uvc -N1 -d1 |
Dual UVC | kernel_mod_list_dual_uvc | insmod /config/modules/4.9.84/usb_f_uvc.ko interrupt_ep_enable=0 insmod /config/modules/4.9.84/g_webcam.ko streaming_maxpacket=3072,1024 uvc_function_enable=2 uac_function_enable=0 | ./prog_uvc -N2 |
Dual UVC + UAC | kernel_mod_list_dual_uvc_uac | insmod /config/modules/4.9.84/usb_f_uvc.ko interrupt_ep_enable=0 insmod /config/modules/4.9.84/g_webcam.ko streaming_maxpacket=3072,1024 uvc_function_enable=2 uac_function_enable=2 p_srate=16000 | ./prog_uvc -N2 -d1 |
3.6. 驱动参数说明¶
-
两路uvc同时出流时,需关闭中断EP,原因是ssd222D的EP不够,如下:
insmod usb_f_uvc.ko interrupt_ep_enable=0 取消Int EP
-
开启两路UVC出流,g_webcam.ko 的参数配置如下:
insmod g_webcam.ko streaming_maxpacket=3072,1024 uvc_function_enable=2
-
双路UVC + UAC
因为 EP3 FIFO SIZE为 64B 所以最大只支持到16K 采样率
insmod g_webcam.ko streaming_maxpacket=3072,1024 uvc_function_enable=2 uac_function_enable=2 p_srate=16000
3.7. uvc参数说明¶
-
uvc_function_enable:设置输出几路UVC,这边设为2表示出两路UVC流
-
uac_function_enable 0: 关闭uac功能, 1: 开启喇叭功能, 2:开启麦克风功能, 3:开启喇叭与麦克风
注意:在加载g_webcam.ko驱动前需确保平台有alsa设备存在,目前由mi_alsa.ko创建。
-
p_srate: 表示音频的采样率为16K
如果有需要直接从VIF获取Raw图给算法运算,需要关闭FBC mode,如下:
echo 0 > /sys/module/mi_vif/parameters/bFBCMode echo FBC 0 > /proc/vpe/vpe_debug
4. demo板连接图¶
SSC9211 demo板连接图:
SSD222/SSD222D demo板连接图:
5. 烧录Image到板子¶
5.1. 烧录空flash¶
空板烧录(或uboot无法运行的板子)需要用isp tool连接烧录(此方法只供开发阶段使用,正式生产使用烧录器烧录母片的方式),具体方法如下。
使用isptool连接前请先断开串口,避免isptool连接失败。断开串口步骤如下:
-
在uboot console下直接输入debug,然后关闭串口终端;
-
在kernel 下直接输入11111,串口显示disable uart时,关闭串口终端。
关闭uart后按如下方法使用isptool烧录。
5.1.1. 烧录SPI NOR Flash¶
新的flash架构,nor flash只需要烧写boot.bin,nand flash只需要烧写cis.bin和boot.bin,具体方法如下:
-
打开isptool,选择spinor,然后点击connect,工具显示connected表示已连接成功。
-
按如下红框的步骤,选择需要烧录boot.bin以及对应的flash地址(如下),然后点击run即可,烧录完成后工具显示pass表示已烧录成功。
Binary file offset Binary放置目录 boot.bin 0x00000 $
5.1.2. 烧录SPI NAND Flash¶
新的flash架构,nor flash只需要烧写boot.bin,nand flash只需要烧写cis.bin和boot.bin,具体方法如下:
-
打开isptool,选择spinand,然后点击connect,工具显示connected表示已连接成功。
-
按如下红框的步骤,选择需要烧录cis.bin以及对应的flash地址(如下),然后点击run即可,烧录完成后工具显示pass表示已烧录成功。
Binary file offset Binary****放置目录 cis.bin 0x00000 $ cis.bin 0x20000 $ boot.bin 0x140000 $ -
同样的步骤烧录第二次cis.bin(注意和第一次的地址不一样,并且Erase Device不勾选)和boot.bin(注意Erase Device不勾选),注意填对应分区的flash地址:
-
烧录完uboot后,关闭isptool然后重新连接串口,板子断电重启可进入uboot终端用tftp升级主程序。
5.2. tftp网络烧录image¶
使用tftp网络烧录image的前提是板子带有uboot程序,如果没有请参考isptool烧录的方法烧录uboot,然后再按如下方法使用tftp烧录。
-
打开tftp工具指向image path:
SDK\project\image\output\images\
,并选择正确的网卡 -
板子连接网络,并确保板子跟PC处于同一个网段(PC需要关闭防火墙)
-
板子开机,长按回车,进入uboot终端
-
首次烧录需要设置IP地址
#setenv gatewayip 192.168.1.1 #setenv ipaddr 192.168.1.127 //设定FTP Client (EVB板子)使用的IP #setenv netmask 255.255.255.0 #setenv serverip 192.168.1.100 //设定FTP server (PC) 的IP #saveenv
注:
-
为了保证烧录顺利,请保证PC和开发板处于同一网段。
-
请采用静态方式固定分配ip。防止烧录时ip地址跳变。
-
您也可以使用独立网卡使PC端直连开发板,固定该网卡的内网ip地址,并按上述方法设定开发板。
-
在uboot终端使用如下命令进行烧录
#estart(默认uboot是关闭网络初始化的,为了节省开机时间,estart命令可以手动初始化uboot的网络参数) #estar (或:estar auto_update.txt,指定auto_update.txt某一行烧录其中某一个分区)
-
5.3. USBDownloadTool空片升级¶
我们提供USBDownloadTool工具包有如下文件:
其中u-boot.bin 是uboot下使用对应nor或者nand flash的config编译出来的u-boot.bin.
5.3.1. UFU空片升级¶
-
将上面的4个文件,拷贝到打包好的镜像中,如放到project/output/image/images中,如下图
-
将flash erase掉,erase的方式如下两种方式:
- 在uboot下
sf probe;sf erase 0 10000
(针对nor flash)
在uboot下
nand chip.erase
(针对nand flash)-
用isptool连接上,connect后,选择erase选项卡,选择end of chip,然后erase,如下图:
在flash erase成功后,断电重启,可以在设备管理器通用串行总线控制器选项中看到一个大容量存储设备,如下图:
- 在uboot下
-
打开USBDownloadTool.exe,点击Update Firmware进行升级
5.3.2. Uboot下UFU升级¶
USBDownload Tool除了可以空片升级外,也可以在uboot下进行ufu升级
-
uboot开启ufucommand
注意:如果选择 Auto run ufu command in boot,那么 u-boot 就会启动跑进 ufu 停住,等待升级。 此项用在空片升级才需要选,正常情况是不需要选上,否则会进不到 kernel。
-
uboot下升级
板子启动进入uboot命令行,执行以下两条命令:
setenv ota_upgrade_status 1 saveenv
然后重启,此时uboot将进入ufu command停住,如下图:
将4个tool文件放到image路径下,然后运行USBDownloadTool.exe,点击“Upgrade Firmware”等待完成升级
升级完成后,注意要清楚ota_upgrade_status,然后重启,否则将会再次进入ufu command:
# setenv ota_upgrade_status 0 # saveenv
5.3.3. Linux PC下UFU升级¶
Linux 系统UFU烧录工具目前支持flash启动和ram启动两种,flash启动即在有nor/nand flash情况下,将IPL、boot、kernel等分区烧录flash后启动;ram启动则是在无flash情况下,直接将IPL、rtos或kernel拷贝到ram中,通过IPL直接启动OS,掉电后信息擦除。
5.3.4. UFU Flash 启动¶
-
将usbdownload 拷贝到需要烧录的image文件夹中
-
开发板连接usb, 将开发板擦成空板或在uboot下输入ufu命令,待PC端识别出
/dev/sg*
或者/dev/sda*
(需chmod+x /dev/sg*
修改下执行权限) -
在root 用户下 执行
./usbdownload /dev/sg*
下面即烧入成功截图
5.3.5. UFU RAM启动¶
-
将usbdownload、bin、AitUVCExtApi.dll 和将要烧入的root.bin或env、kernel、rootfs.ramfs拷贝到同一目录下
-
开发板连接usb,待PC端识别出
/dev/sg*
或者/dev/sda*
(需chmod+x /dev/sg*
修改下执行权限) -
在root 用户下 执行
./usbdownload /dev/sg*
即可
注:
-
直启Linux时由于需要传递bootargs 给kernel,所以需要 env文件,IPL读取env中的bootargs传递给kernel。
-
需注意rootfs只支持 ramfs。