龙芯久久派Plus折腾笔记
感谢尚宇学长送的开发板,希望龙芯以后发展越来越好<(=w=)>
这回折腾用到的主要有:
- 本体:2k0300 久久派_Plus_V1.0
- 开发设备:Linux环境笔记本电脑
- 串口转接器:用一个老51开发板糊弄过去了(
- 路由器:提供稳定网络连接和局域网
开箱
尊贵的总裁签名版(虽然看不太清)↑
接口丰富度没得说,两个RJ45,两个USB2.0,一个3.5mm音频接口,UART,ADC,JTAG和Type-C供电,还有个MicroSD卡插槽。
这规格,只要三位数出头的价格,它就是炸了我都夸它炸得好听。稳定性跟功耗也没得说,ABI2.0的龙架构让它能拥有开源社区的支持,基本所有开源软件都可以通过交叉编译在这个板子上使用,未来可期属于是。
上电
手头刚好没USB转串口,想到个幽默办法。掏出以前的51单片机开发板HC6800MS,给ST89C52RC薅下来,TX,RX,GND分别接到开发板的RXD0,TXD0,GND上:
然后给那个老板子插电脑上:
诶,这不就有了吗。
现在就能用screen
从串口连接上开发板了:
1 | sudo screen /dev/ttyUSB0 115200 |
效果如下:
板子上电之后会默认启动WiFi热点,配置文件如下:
1 | #/etc/hostapd.conf |
虽然可以连上WiFi,但是它的sshd
进程好像是默认不开启的。
哦它没有openssh啊。
交叉编译
在x86设备上跨架构构建龙芯的Arch Linux软件包 - 星外之神的博客 | wszqkzqk Blog
pacman/提示和技巧 - Arch Linux 中文维基
离线安装 - Arch Linux 中文维基
从现有 Linux 发行版安装 Arch Linux - Arch Linux 中文维基
参数,来自xdosc的佬@chi
1 | CFLAGS='--with-arch=loongarch64 --with-tune=la464 --with-abi=lp64d --with-simd=none --disable-threads' |
OpenSSH
准备目录./openssh并进入,下载源码:
1 | wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.8p |
创建目录./openssh/install
创建脚本env.sh:
1 |
|
上面指向的是交叉编译工具链的路径,提前准备。
准备环境:source ~/env.sh
编译zlib:
1 | cd zlib-1.3.1/ |
编译openssl
:
1 | cd openssl-3.3.2/ |
编译openssh:
1 | ./configure --host=loongarch64-unknown-linux-gnu --prefix=$HOME/2k300/openssh/install/openssh --with-ssl-dir=$HOME/2k300/openssh/install/openssl --with-zlib=$HOME |
注意 此处使用
~
概率会导致编译异常,使用$HOME
代替
这里因为没找到在哪指定strip工具的位置而禁用了strip,所以产物会稍微有丶大。
编译结束之后,产物可以在$HOME/2k300/openssh/install/openssh
中找到。直接把文件传输到99pi对应的目录里即可。
传输方法可以使用tty串口传输,不过速度太慢:
1 | # server-side |
也可以使用tftp传输:
1 | # server-side: |
剩下的后面说。
Vim
1 | tar -zxvf ncurses-6.5.tar.gz && rm ncurses-6.5.tar.gz |
1 | export TARGET=loongarch64-unknown-linux-gnu |
Linux Kernel
参考文档:龙芯2K300.软件uboot用户手册0.2
把linux6.9源码里的
arch/loongarch/boot/dts
include/dts-bindings
复制到新的内核源码的对应位置,然后
1 | make ARCH=loongarch CROSS_COMPILE=loongarch64-unknown-linux-gnu- ls2k0300_99_pai_wifi_defconfig |
产物:
arch/loongarch/boot/vmlinux.bin
System.map
现在制作vmlinux.bin.lzma
1 | lzma -k ./linux-6.11/arch/loongarch/boot/vmlinux.bin |
创建文件:multi.its,并更新其中的
images/kernel-1/entry
:为./linux-6.11/System.map
中的kernel_entry
的地址,格式参考下方images/kernel-1/data
:为lzma文件相对于当前文件的路径
1 | /* |
生成uImage
镜像:mkimage -f multi.its uImage
Arch Linux
主要原因是aur比较香,而且软件分发也相对简单,反正pacman作为包管理够用。
北大的LCPU整了个LA64的AUR镜像源:
arch安装的核心就是准备一个能跑起来pacstrap的环境,然后就能用pacstrap去准备arch的rootfs了。
意外发现原来有LA64的arch安装iso,这下不用自己准备rootfs了,好耶
居然忘了3A6000已经能用Arch了
哦,忘了,3A6000的abi跟2K0300不太一样,果然最后还是翻车了
解压发现其中的airootfs.sfs
,arch下安装squashfs-tools
后,使用sudo unsquashfs airootfs.sfs
解压rootfs。完成后编译一个uImage
,丢到rootfs的/boot
下。
准备一个ext4的U盘,将rootfs复制到其中。U盘插入99pi,启动并进入uboot cli,输入:
1 | ext4load usb 0 ${loadaddr} boot/uImage |
手动启动系统。
不过启动失败了,查报错感觉问题可能出在指令集不兼容上了,似乎是LA64的SIMD指令在2k300上用不了。
下一步应该就是手动编译一个arch rootfs再安装了。
刷uboot
可以借助tftp刷入,也可以usb刷入。我用了后一种方法:
1 | # 主系统 |
1 | # 99pi |
下面是输出:
1 | PMON> fload /dev/fs/ext2@usb0/u-boot-spl-gz.bin / |
此时就完成了,可以重启了。
配置uboot参数
1 | setenv bootargs console=ttyS0,115200n8 root=/dev/sda1 rootdelay=3 |
编译busybox最小系统
流程很简单:
1 | mkdir -p ./{src,} |
问题
- 编译失败
不知道为啥,换musl-gcc
就可以了。
make menuconfig
总是会失败
刚开始以为确实是依赖问题,把能想到的玩意都装了一圈之后觉得不对劲上Arch Wiki搜了一下:
[已解决] make menuconfig 和 ncurses 库的问题 / 新手 / Arch Linux 论坛
esp8266-rtos-sdk-aur-ncurses-fix.patch - aur.git - AUR Package Repositories
最后发现是./scripts/kconfig/lxdialog/check-lxdialog.sh
的锅。里边的check()
函数对main的写法有问题:应该在下图的main()前面加上int才能正常check到是否安装了ncurses库。
- 启动失败
我这里是因为menuconfig总是失败所以没法开Build static binary,开开就能跑了。