Skip to content
Tang Shizhi edited this page Sep 15, 2018 · 21 revisions

写龙芯开发板Flash的参考方法

  1. 安装ExtraPuTTy。ExtraPuTTy相当于一个PuTTy的插件,需要在电脑里已有PuTTy的情况下使用。安装后ExtraPuTTy如果找不到PuTTy,需要手动选择路径。不建议使用官方建议的ECOM串口助手,因为可能有病毒;
  2. 用Vivado将lab_environment_v1.00\flash_programmer\programmer_by_uart\programmer_by_uart.bit烧入FPGA;
  3. 打开ExtraPuTTy,波特率设为230400,并将Serial选项中的Flow Control设为XON/XOFF
  4. 按reset,然后在串口中键入"x",最后在上方菜单中选择 File Transfer -> Xmodem 进行传输。

Linux相关

在QEMU中运行Linux

下载Linux v4.15

git clone [email protected]:torvalds/linux.git
git reset --hard v4.15

编译

# 可用 ARCH=mips make help 查看编译选项(此处不要忘记ARCH,否则看到的是不一样的帮助)
ARCH=mips make malta_defconfig # 因为qemu仿真的是malta
ARCH=mips make config # 或 ARCH=mips make nconfig 等
# 修改如下选项:
# Cross-compiler tool prefix (CROSS_COMPILE) [mipsel-linux-gnu-]
ARCH=mips make all

若需要编译成U-Boot镜像,使用ARCH=mips make uImage,镜像会生成于arch/mips/boot

编译用户态程序BusyBox

BusyBox网站下载BusyBox 1.28.2,编译:

make defconfig
make menuconfig
# 选以下两个选项
# 1. Busybox Settings -> Build Options -> Build BusyBox as a static binary
# 2. 交叉编译器名字
make

然后生成文件系统镜像

dd if=/dev/zero of=rootfs.img bs=4096 count=1024
mkfs.ext3 rootfs.img
mkdir _install
sudo mount -o loop rootfs.img _install # 注意:mount 之后 _install 所有者会变成 root
sudo make install # make install 实则是把文件复制到_install文件夹中
sudo umount _install

运行

qemu-system-mipsel -kernel vmlinux -serial mon:stdio -nographic -append "console=ttyS0 root=/dev/sda init=/bin/sh" path/to/rootfs.img

若需要调试,首先安装gdb-multiarch,然后

qemu-system-mipsel -kernel vmlinux -serial mon:stdio -nographic -append "console=ttyS0 root=/dev/sda init=/bin/sh" path/to/rootfs.img -s -S
# 打开另一个终端
gdb-multiarch vmlinux
(gdb) set arch mips
(gdb) target remote :1234
# 可以使用 layout asm 或者 layout regs 方便调试(使用layout后需要focus CMD将焦点重新置于命令窗口)

在开发板上运行Linux

  1. 目前先使用这个Linuxnaivemips分支;

  2. 编辑arch/mips/boot/dts/thinpad/naivemips-thinpad.dts,更改串口中断号、总内存、时钟频率等,其中串口的时钟频率设为波特率*16;

  3. drivers/tty/serial/naivemips-uart.c中的波特率都从115200改成9600,时钟改为9600*16;

  4. mkdir busybox/dev(因为git不存空文件夹)

  5. 默认配置选用ARCH=mips make thinpad_defconfig

  6. 执行ARCH=mips make nconfig更改设置:a.交叉编译器;b.改Machine selection -> Machine typeThinpad-NG(对,不是NSCSCCThinpad-NG里用的是我们想要的串口驱动);c.Kernel type -> Timer frequency改为24Hz(不然对于我们的龟速SoC太快);d.若为多核,将Kernel type -> Multi-Processing support打开;e.若需要打开浮点数相关功能,在arch/mips/include/asm/mach-thinpad/cpu-feature-overrides.h 中加入#define cpu_has_fpu 1即可

  7. 执行ARCH=mips make allARCH=mips make uImage编译出U-boot使用的镜像;

  8. 用U-boot来启动。如果想设置内核参数,不要使用setenv bootargs命令,此命令出于不明原因不起作用,请在ARCH=mips make nconfig中设Kernel hacking -> Built-in kernel command line。

附1:让Kernel panic报详细的错误信息

  1. 编辑arch/mips/Kconfig,添加select HAVE_DEBUG_BUGVERBOSE
  2. 执行ARCH=mips make nconfig,会发现Kernel hacking里DEBUG_BUGVERBOSE变成y了。保存并重新编译即可。

附2:输出调试

使用pr_notice进行输出调试,用法与printf相同。(printk的用法不一样)

U-Boot相关

适用于nCore的U-Boot已移动到此repo,相关文档见此Wiki

μCore相关

适用于nCore的μCore已移动到此repo

μCore+相关

请使用此repo

监控程序使用方法

编译监控程序

监控程序在Neptunus项目的monitor文件夹下。

  • 监控程序需要mips-sde-elf交叉编译器,与我们使用的mipsel-linux-gnu不同。不能直接将Makefile中的mips-sde-elf改为mipsel-linux-gnu,因为这会导致编译错误,并且除了Makefile,Term中也调用了交叉编译器。可以在这里下载此交叉编译器。

  • 这个交叉编译器是i686的,不能在64位系统上直接运行,需要在Linux上配置32位兼容。并且,Windows的Ubuntu子系统就算配了兼容也用不了(官方不支持),所以要用虚拟机。具体地,执行以下命令:

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
sudo apt-get install gcc-multilib g++-multilib
  • 把这个编译器的bin/目录加进$PATH。注意:不能直接把可执行文件赋值进系统/usr/bin/,因为它会使用相对路径。

  • 执行make ON_FPGA=yON_FPGA一定要设,不然串口地址会错。还可以设EN_TLB=y来打开TLB,但是这个版本用到了tlbrtlbp,我们没有实现,所以暂时跑不了。

  • 执行mips-sde-elf-objcopy -j .text -O binary flash.img flash.bin,将flash.bin写入flash。

修改Term(终端)

监控程序在Neptunus项目的term文件夹下。

  • 执行sudo -H pip install pyserial安装Python2的串口模块

  • 修改term.py的第172行,将波特率设成相应的值(目前是9600)

  • 修改term.py的第187行,将Main()改为Main(False),因为我们的板子不会打印欢迎信息

  • Term也需要使用mips-sde-elf交叉编译器,但是上一节说的改$PATH的方法只能作用于shell,Term还是会找不到编译器。可以暂时修改第12行的CCPREFIX常量,将地址硬编码进去

运行

  • 因为Term也需要使用mips-sde-elf交叉编译器,所以要在虚拟机里连接串口。在虚拟机的可移动设备选项,将Linux Foundation Thinpad使用权交给虚拟机

  • 记得打开网页把串口模式设为直连而非CPLD

  • 执行ls /dev | grep /dev/ttyACM找出你的串口叫什么序号

  • 访问串口需要管理员权限,所以我们用sudo执行Term。具体地,执行sudo -H ./term.py 上一步找出的串口名

Term支持的命令与其repo上的略有不同,记录如下:

  • R:查看所有通用寄存器的值

  • D:查看某地址开始若干字节的内存。此命令会交互式地要求你输入地址(16进制不带0x字样,下同)和字节数(10进制,下同)

  • U:与D相同,但长度单位改为字(32位)

  • A:向某地址开始的连续内存写入数据或指令。首先此命令会交互式地要求你输入起始地址,然后会要求你输入每一个字(32位)的数据或指令,你既可以输入十六进制数,也可以输入汇编指令

  • G:运行某地址开始的程序

注1:虽然其repo上说的命令格式像是命令名+参数在一行,但事实上参数是要交互式输入的。

注2:可能出现的问题:如果板子向Term发出了串口信息,但Term崩溃了,这个信息就会留在Linux的串口缓冲区里没人读,下次打开Term时读到的可能就是旧的值。解决方法可以是重启Linux,也可以手动写一个python程序,仿照他的方式把串口缓冲区读空。

功能测试情况

功能测试应全部通过。测试点列表见func_test/README.md