龙芯久久派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
2
3
4
5
6
7
8
9
10
11
12
13
14
#/etc/hostapd.conf
interface=wlan0
driver=nl80211
ssid=LoongsonWIFI
hw_mode=g
channel=6
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=loongson123456
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

虽然可以连上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
2
3
4
5
6
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.8p  
1.tar.gz
wget http://www.zlib.net/zlib-1.3.1.tar.gz
wget https://github.com/openssl/openssl/releases/download/openssl-3.3.
2/openssl-3.3.2.tar.gz
for item in $(ls ./);do tar -zxvf $item; done

创建目录./openssh/install
创建脚本env.sh:

1
2
#!/bin/bash
export PATH="$PATH:/path/to/cross-tools/bin"

上面指向的是交叉编译工具链的路径,提前准备。

准备环境:source ~/env.sh

编译zlib:

1
2
3
4
cd zlib-1.3.1/
prefix=$HOME/2k300/openssh/zlib CC=loongarch64-unknown-linux-gnu-gcc AR=loongarch64-unknown-linux-gnu-ar ./configure
make
make install

编译openssl

1
2
3
4
cd openssl-3.3.2/
./Configure linux64-loongarch64 --cross-compile-prefix=loongarch64-unknown-linux-gnu- --prefix=$HOME/2k300/openssh/install/openssl shared no-asm
make
make install

编译openssh:

1
2
3
4
./configure --host=loongarch64-unknown-linux-gnu --prefix=$HOME/2k300/openssh/install/openssh --with-ssl-dir=$HOME/2k300/openssh/install/openssl --with-zlib=$HOME  
/2k300/openssh/install/zlib LDFLAGS="-static -pthread" --sysconfdir=/etc/ssh --disable-strip
make
make install-files

注意 此处使用~概率会导致编译异常,使用$HOME代替

这里因为没找到在哪指定strip工具的位置而禁用了strip,所以产物会稍微有丶大。

编译结束之后,产物可以在$HOME/2k300/openssh/install/openssh中找到。直接把文件传输到99pi对应的目录里即可。

传输方法可以使用tty串口传输,不过速度太慢:

1
2
3
4
# server-side
uuencode [filename-in-99pi] < [file] > /dev/ttyUSB0
# 99pi-side
uudecode < /dev/ttyS0

也可以使用tftp传输:

1
2
3
4
# server-side:
sudo uftpd -n -o ftp=0,tftp=69 ./
# 99pi-side
tftp -g -l ssh-xxx -r openssh/bin/ssh-xxx [114.5.1.4]

剩下的后面说。

Vim

1
2
3
4
tar -zxvf ncurses-6.5.tar.gz && rm ncurses-6.5.tar.gz
cd ncurses-6.5/
./configure --prefix=$HOME/2k300/vim/nc_install --host=loongarch64-unknown-linux-gnu --without-cxx-binding --without-ada --without-progs --without-tests --with-shared
make -j && make install
1
2
export TARGET=loongarch64-unknown-linux-gnu

Linux Kernel

参考文档:龙芯2K300.软件uboot用户手册0.2

把linux6.9源码里的

  • arch/loongarch/boot/dts
  • include/dts-bindings

复制到新的内核源码的对应位置,然后

1
2
make ARCH=loongarch CROSS_COMPILE=loongarch64-unknown-linux-gnu- ls2k0300_99_pai_wifi_defconfig
make ARCH=loongarch CROSS_COMPILE=loongarch64-unknown-linux-gnu- -j8

产物:

  • arch/loongarch/boot/vmlinux.bin
  • System.map

现在制作vmlinux.bin.lzma

1
2
lzma -k ./linux-6.11/arch/loongarch/boot/vmlinux.bin
mv ./linux-6.11/arch/loongarch/boot/vmlinux.bin.lzma ./

创建文件:multi.its,并更新其中的

  • images/kernel-1/entry:为./linux-6.11/System.map中的kernel_entry的地址,格式参考下方
  • images/kernel-1/data:为lzma文件相对于当前文件的路径
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/*
* U-Boot uImage source file with multiple kernels and ramdisks blobs
*/
/dts-v1/;
/{
description = "Various kernels and ramdisks blobs";
#address-cells = <2>;
images {
kernel-1 {
description = "vmlinux";
data = /incbin/("vmlinux.bin.lzma");
type = "kernel";
arch = "loongarch";
os = "linux";
compression = "lzma";
load = <0x90000000 0x00200000>;
entry = <0x90000000 0x01348000>;
};
};
configurations {
default = "config-1";
config-1 {
description = "vanilla-2.6.23 configuration";
kernel = "kernel-1";
loadables = "kernel-1";
};
};
};

生成uImage镜像:mkimage -f multi.its uImage

Arch Linux

主要原因是aur比较香,而且软件分发也相对简单,反正pacman作为包管理够用。

北大的LCPU整了个LA64的AUR镜像源:

Arch Linux for Loongarch64

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
2
ext4load usb 0 ${loadaddr} boot/uImage
bootm ${loadaddr}

手动启动系统。

不过启动失败了,查报错感觉问题可能出在指令集不兼容上了,似乎是LA64的SIMD指令在2k300上用不了。

下一步应该就是手动编译一个arch rootfs再安装了。

刷uboot

可以借助tftp刷入,也可以usb刷入。我用了后一种方法:

1
2
3
4
5
# 主系统
mkfs.ext2 /dev/sdb # 格式化U盘
mount /dev/sdb ./tmp
cp u-boot-spl-gz.bin ./tmp/
umount ./tmp
1
2
3
4
# 99pi
# 插入U盘
# 启动时多次按c进入PMON控制台
fload /dev/fs/ext2@usb0/u-boot-spl-gz.bin

下面是输出:

1
2
3
4
5
6
7
8
9
10
PMON> fload /dev/fs/ext2@usb0/u-boot-spl-gz.bin                                                            /  
Loading file: /dev/fs/ext2@usb0/u-boot-spl-gz.bin dl_offset 900000000f800000 addr 900000000f800000
(bin)                                                                                                      |
Loaded 580432 bytes

Programming flash 900000000f800000:8db50 into 800000001c000000
Erase end!                                                                                                 /
Programming end!
Verifying FLASH. No Errors found.
PMON>

此时就完成了,可以重启了。

配置uboot参数

1
2
setenv bootargs console=ttyS0,115200n8 root=/dev/sda1 rootdelay=3
saveenv

编译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,开开就能跑了。

作者

xeonds

发布于

2024-09-12

更新于

2024-11-07

许可协议

评论