-
Notifications
You must be signed in to change notification settings - Fork 0
Home
- 安装ExtraPuTTy。ExtraPuTTy相当于一个PuTTy的插件,需要在电脑里已有PuTTy的情况下使用。安装后ExtraPuTTy如果找不到PuTTy,需要手动选择路径。不建议使用官方建议的ECOM串口助手,因为可能有病毒;
- 用Vivado将
lab_environment_v1.00\flash_programmer\programmer_by_uart\programmer_by_uart.bit
烧入FPGA; - 打开ExtraPuTTy,波特率设为230400,并将Serial选项中的Flow Control设为XON/XOFF;
- 按reset,然后在串口中键入"x",最后在上方菜单中选择 File Transfer -> Xmodem 进行传输。
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 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的
naivemips
分支; -
编辑
arch/mips/boot/dts/thinpad/naivemips-thinpad.dts
,更改串口中断号、总内存、时钟频率等,其中串口的时钟频率设为波特率*16; -
把
drivers/tty/serial/naivemips-uart.c
中的波特率都从115200改成9600,时钟改为9600*16; -
mkdir busybox/dev
(因为git不存空文件夹) -
默认配置选用
ARCH=mips make thinpad_defconfig
; -
执行
ARCH=mips make nconfig
更改设置:a.交叉编译器;b.改Machine selection -> Machine type
为Thinpad-NG
(对,不是NSCSCC
,Thinpad-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
即可 -
执行
ARCH=mips make all
和ARCH=mips make uImage
编译出U-boot使用的镜像; -
用U-boot来启动。如果想设置内核参数,不要使用
setenv bootargs
命令,此命令出于不明原因不起作用,请在ARCH=mips make nconfig
中设Kernel hacking -> Built-in kernel command line。
- 编辑arch/mips/Kconfig,添加
select HAVE_DEBUG_BUGVERBOSE
; - 执行
ARCH=mips make nconfig
,会发现Kernel hacking里DEBUG_BUGVERBOSE
变成y了。保存并重新编译即可。
使用pr_notice
进行输出调试,用法与printf
相同。(printk
的用法不一样)
适用于nCore的U-Boot已移动到此repo,相关文档见此Wiki。
适用于nCore的μCore已移动到此repo。
请使用此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=y
。ON_FPGA
一定要设,不然串口地址会错。还可以设EN_TLB=y
来打开TLB,但是这个版本用到了tlbr
和tlbp
,我们没有实现,所以暂时跑不了。 -
执行
mips-sde-elf-objcopy -j .text -O binary flash.img flash.bin
,将flash.bin
写入flash。
监控程序在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