新唐 N3290X 开发板使用手记

真的是第一次使用开发板——相比于树莓派,开发版这种东西难用多了。

世上无难事,只要肯放弃

?

开发板说明

这个开发板是一个基于 Arm 的多媒体开发板,可以跑 Linux,也可没有操作系统裸跑(叫做 None-OS)。里面集成了常用的多媒体编码解码操作,例如 JPEG 解码啊啥的。

看说明,「开发板」这种东西好像需要「烧制」,也就是写好的东西不能直接像普通 Linux 软件那样直接跑,而是需要用烧录软件(例如,TorboWriter)将文件放到 Memory 的特定区域,然后板子才能加载文件跑起来。

仔细研究了一天,发现好像如果只跑比较「高层」的 Linux 软件的话,是不用进行烧制的。怎么理解呢?一个板子分为好几层,最下层是类似 BIOS 的东西,负责板子的自举和启动。启动之后,控制权交给第二层,再做一大堆东西。做完之后,控制权交给第三层,Linux 操作系统,然后为所欲为。

前面两层是需要用专用的 TorboWriter 进行烧制的,但最后面的 Linux 操作系统层的烧制方法不同:我们写好的应用和 Linux 操作系统一起打一个特殊的包,命名为 conprog.bin。将板子通过 USB 连到电脑上,将此文件放到「nand1-1」这个盘里面即完成了「烧制」。

OK,这样一来我们的开发任务就可以简化一点了。

连接电脑

小纠结。但好像对微电子出身的同学们不是难事儿(意思是对于计算机出身的同学就完全丈二和尚了)。

这个板子上有几个接口:

  • USB 口:哦,顾名思义了。可用来烧写程序
  • COM 口:在没有屏幕的时代,这个口子就是计算机与板子沟通的桥梁
  • JTAG 口:用于调试硬件的
  • 电源口:废话啦

下面是几个实验:

  1. 只插电源口:板子是「工作」状态,最正常不过了
  2. 只插 USB 口:板子等待烧录。应该是叫「恢复模式」。这时候,如果是 NoneOS 的话可以使用烧录软件(TurboWriter)进行烧录,如果是 Linux 的话会被识别成两个 U 盘,可以将固件拖拽进去
  3. 插电源口和 COM 口:板子正常工作,电脑使用 COM 口进行连接,相等于远程登录。里面开了一个 BusyBox
  4. 插电源口和 USB 口:USB 口优先,即进入「恢复模式」等待烧写固件
  5. JTAG 口没试过

我们的目的是跑 Linux,所以需要用 COM 口进行连接。

使用「公(板子上是公头,所以连接板子的线要用母头)对母(我的电脑上是母口)直连线(异性用直连,同性用交叉)」将板子和电脑相连,然后打开 PuTTY,选择连接类型为 Serial,地址为/dev/ttyS0,波特率为 115200,编码为 UTF-8,点击连接。如果没有看到东西的话,可以按以下板子上的「Reset」键重启板子。

这时候,我们应该可以看到里面正在跑的 BusyBox 了。

如果不想使用 PuTTY,那么可以使用神奇的 Screen:screen /dev/ttyS0 115200

Linux 开发环境搭建

系统

既然可以跑 Linux,那么直接在 Linux 下面进行编写调试应该是最方便的。正好自己的系统是 Debian9,不用专门为这个板子的开发而换系统。

我们的电脑是 X86 架构的,但是开发板是 Arm 架构的。在 X86 上面编译 Arm 的东西,需要「交叉编译」环境。我们首先需要安装一些依赖。

  1. 头文件
          sudo apt install libncurses5-dev 
    
  2. 不知道是干啥的,但不安的话下面 arm-linux-gcc 会报错(明明 arm-linux-gcc 文件就在那儿,但是直接执行的话说找不到这个文件)
          sudo apt-get install lsb-core
    
  3. 继续,不知道干啥的,但不安的话 arm-linux-gcc 会报一些头文件找不到
          sudo apt-get install lib32stdc++6
    
  4. 继续一些其他奇奇怪怪的东西,用到了的话会补充在这里

工具链

传说中的 ToolChain,名词听着好熟悉。

我们直接从新唐官网上下载下来 ARM Linux GNU Tool Chain 即可。然后使用附带的安装脚本(arm_linux_4.2_install.sh)一键安装。

这里需要注意,如果直接去网上搜索的话,也有一个叫做 ARM Linux GNU Tool Chain 的东西。但是呢,前面一个好像是新唐自己定制的,后一个是 “比较通用一点” 的。我没有做详细的对比实验。建议直接用新唐提供的,等熟悉之后再研究后面那个。

板级支持包

Board Support Package(BSP),可以理解为一个经过定制的操作系统的最底层代码。

同样,官网下载(W55FA93BSP2.6.35_130611.tar.gz),一键安装(w55fa93bsp_install.sh)。

我们先来看一下 BSP 的整个目录结构。

  • linux-2.6.35.4:Linux 内核源代码
  • Image: 最后生成的 conprog.bin 会出现在这里
  • rootfs*:Linux 基本文件结构,将会被整体打包成 conprog.bin
  • patch:内核 Patch,不知道怎么用
  • applications:一些 Demo 项目。我们可以照着这里面的东西写自己的 Aplication

尝试编译 Linux

人生第一次编译 Linux 内核……当然会出各种问题!当然,如果是按照上面步骤来走的,那么大部分问题其实都已经解决了。

  1. 进入 linux-2.6.35.4 文件夹,根据板子的不同,make 出不同的配置文件。

    这个在手册(N329 Series MCU Linux 2.6.35 BSP User's Manual)里面有写。

    对于我拿到的板子,咒语是 make w55fa93_WQVGA_defconfig

    我们还可以执行 make menuconfig 来配置内核参数

    如果我们不想自己生成配置文件,还可以用同文件夹下厂家设定好的配置文件(N3290X_480x272.config),将其改名为.config 即可使用

  2. 执行./build

    其实可以加上多线程的参数,./build -j 8 ,这样编译会快一点。

    由于我想使用 NAND 进行引导(这个东西是啥我也不知道),所以加上 nand 参数,变成./make nand -j 8

  3. 一般来说……一般来说是会报错的!会在 include/generated/timeconst.h 里面报一个错。

    解决方法是,将 kernel/timeconst.pl 中第 373 行的 defined() 函数去掉,只留下 @val

  4. 上面问题解决后,继续 build。编译很快的。

  5. ../image 里面会生成我们需要的 conprog.bin 文件。

将内核放入板子

激动人心的时刻!

  1. 板子上 JP1 跳线开路
  2. 不插 5V 电源
  3. USB 连电脑,会出现 NAND1-1 和`NAND1-2“
  4. conprog.bin 文件放入 NAND1-1
  5. 断开 USB,改用 5V 电源供电

卡在了 Unable to enumerate USB device on port 1,这个怎么解决

好像不用解决。其实 BusyBox 是跑起来了的。只是 USB 不能用和看着不爽而已。

NAND1-1 内文件

  1. movie.avi:开机动画,好像即使没有内核,也能正常播放这个动画
  2. pointercal:触摸屏校正文件,不要删除。删除之后开机会重新教准触摸屏
  3. boot_script:好像和应用自动启动有关,可能是下文所说的「入口脚本」
  4. conprog.bin:Linux 内核、RootFS 和一些我不知道的东西的打包

Linux 启动过程

原厂给的脚本是将 linux 内核与文件系统编译到一个文件中

运行流程:

  1. 内核启动
  2. 执行文件系统中的 /etc/inittab 文件配置 shill 运行环境
  3. 运行 /etc/profile 文件
  4. 在 profile 文件中加载 NAND 芯片驱动
  5. 挂载两个 NAND 磁盘
  6. 运行一个 NAND1-1 磁盘上的入口脚本 boot_script

编译 OpenCV

没有搞过交叉编译,所以以下东西可能不对

  1. 获取源代码包并解压缩
  2. 写一个配置文件 platforms/linux/arm-linux.toolchain.cmake
      set(CMAKE_SYSTEM_NAME Linux)
      set(CMAKE_SYSTEM_PROCESSOR arm)
      set(CMAKE_C_COMPILER arm-linux-gcc)
      set(CMAKE_CXX_COMPILER arm-linux-g++)
    
      set(WITH_TBB ON)
      set(SOFTFP ON)
      set(CMAKE_BUILD_TYPE RELEASE)
      set(INSTALL_C_EXAMPLES ON)
      set(BUILD_EXAMPLES ON)
    
      set(GCC_COMPILER_VERSION "" CACHE STRING "GCC Compiler version")
      set(GNU_MACHINE "arm-linux" CACHE STRING "GNU compiler triple")
      include("${CMAKE_CURRENT_LIST_DIR}/arm.toolchain.cmake")
    
      set(CMAKE_SYSTEM_VERSION 2.6)
    
  3. 创建 Build 文件夹并进入
      mkdir build && cd build
    
  4. 使用 CMake 进行配置
      cmake -D CMAKE_TOOLCHAIN_FILE=../platforms/linux/arm-linux.toolchain.cmake ../
    
  5. 开始编译
          make all -j 8
          make install
    

编译好了之后,将编译生成的所有文件覆盖到 rootfs 相应文件夹里,然后继续编译内核并打包、烧制。

然后华丽丽地花屏了——我也不知道怎么回事。

先暂告一段落。继续忙其他事儿去了。


已发布

分类

作者:

标签

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注