iStoreOS适配HT2

配置环境

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
29
30
31
32
33
34
35
36
37
# Debian 12 WSL1下为HT2适配编译istoreos
sudo apt install build-essential asciidoc binutils bzip2 gawk \
gettext git libncurses5-dev libz-dev patch unzip zlib1g-dev curl \
lib32gcc-s1 libc6-dev-i386 subversion flex uglifyjs libssl-dev wget \
gcc-multilib p7zip p7zip-full msmtp texinfo libglib2.0-dev xmlto rsync \
qemu-utils libelf-dev autoconf automake libtool autopoint device-tree-compiler python-is-python3

# WSL1编译的话需要如下剔除Windows的PATH内容
sudo vi /etc/wsl.conf
[interop]
appendWindowsPath = false

# WSL1设置代理来加速源码下载,没有代理可跳过或根据需求设置。如下是WSL1设置网络代理的例子
export all_proxy="http://172.23.240.1:7890"

# 获取iStore官方源码
git clone --depth=1 -b istoreos-22.03 https://github.com/istoreos/istoreos.git
cd istoreos
wget https://fw0.koolcenter.com/iStoreOS/h28k/feeds.conf

# 以后每次编译前建议执行以下三行命令更新源码
git pull
./scripts/feeds update -a
./scripts/feeds install -a

# 下载iStore官方的H88K编译配置文件
wget -O .config https://fw0.koolcenter.com/iStoreOS/h28k/config.buildinfo

# 开始编译
make menuconfig # 进入固件配置界面
make download V=s -j8 # 下载所需源码,请尽量使用梯子
make V=s -j$(nproc) # 首次编译推荐用单线程

# 清理相关
make clean # 在源码有大规模更新或者内核更新后执行,以保证编译质量,此操作会删除/bin和/build_dir目录中的文件
make dirclean # 更换架构编译前必须执行,此操作相当于 make clean 以及删除/staging_dir、/toolchain、/tmp和/logs中的文件
make distclean # 除非打算 push 到远程仓库 否则几乎用不到,此操作相当于 make dirclean 外加删除/dl、/feeds目录和.config文件

设备适配

  1. 因为HT2与H28K是姐妹机型,所以我们参考 iStore的H28K适配提交 得知适配设备需要修改如下文件
1
2
3
4
5
6
target/linux/rockchip/dts/rk3528/rk3528-ht2.dts			# HT2的DTS文件
target/linux/rockchip/image/rk35xx.mk # 添加设备菜单中
target/linux/rockchip/rk35xx/base-files/etc/board.d/01_leds # LED配置
target/linux/rockchip/rk35xx/base-files/etc/board.d/02_network # 网口配置
target/linux/rockchip/rk35xx/base-files/lib/board/init.sh # 初始化设置
target/linux/rockchip/rk35xx/base-files/lib/upgrade/ota.sh # OTA更新
  1. HT2的DTS文件来自 Armbian社区
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
29
30
31
32
33
34
35
36
wget https://github.com/armbian/linux-rockchip/raw/rk-5.10-rkr6/arch/arm64/boot/dts/rockchip/rk3528-hinlink-ht2.dts \
-O target/linux/rockchip/dts/rk3528/rk3528-ht2.dts

# 后两个diff可解决该dts在istore下dmesg中循环报错:vdd_cpu: ramp_delay not set

--- rk3528-hinlink-ht2.dts 2024-03-06 09:11:25.977886600 +0800
+++ rk3528-ht2.dts 2024-03-04 17:41:57.922121600 +0800
@@ -13,8 +13,8 @@
#include "rk3528.dtsi"

/ {
- model = "Hinlink HT2";
- compatible = "hinlink,ht2", "rockchip,rk3528";
+ model = "Hlink HT2";
+ compatible = "hlink,ht2", "rockchip,rk3528";

aliases {
ethernet0 = &gmac1;
@@ -169,6 +169,8 @@
regulator-always-on;
regulator-boot-on;
regulator-settling-time-up-us = <250>;
+ regulator-enable-ramp-delay = <400>;
+ regulator-ramp-delay = <12500>;
pwm-supply = <&vcc5v0_sys>;
status = "okay";
};
@@ -183,6 +185,8 @@
regulator-always-on;
regulator-boot-on;
regulator-settling-time-up-us = <250>;
+ regulator-enable-ramp-delay = <400>;
+ regulator-ramp-delay = <12500>;
pwm-supply = <&vcc5v0_sys>;
status = "okay";
};
  1. 添加设备到菜单中
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
# 设备信息要与上面DTS中的对应,否则会对不上

--- istoreos-src/target/linux/rockchip/image/rk35xx.mk 2024-02-26 19:08:59.007407100 +0800
+++ istoreos-ht2/target/linux/rockchip/image/rk35xx.mk 2024-02-24 23:25:55.400878600 +0800
@@ -206,6 +206,20 @@
endef
TARGET_DEVICES += hlink_h28k

+define Device/hinlink_rk3528
+$(call Device/rk3528)
+ DEVICE_VENDOR := HINLINK
+ DEVICE_PACKAGES := kmod-r8168 kmod-thermal
+endef
+
+define Device/hlink_ht2
+$(call Device/hinlink_rk3528)
+ DEVICE_VENDOR := Hlink
+ DEVICE_MODEL := HT2
+ SUPPORTED_DEVICES += hlink,ht2
+endef
+TARGET_DEVICES += hlink_ht2
+
define Device/inspur_ihec301
$(call Device/rk3588)
DEVICE_VENDOR := Inspur
  1. LED配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 左侧红灯不受控制,中间绿色led_green对应DTS中RK_PB7,右侧黄灯led_blue对应DTS中RK_PC0
# 没得选择,黄灯跟随eth0的网络活动而闪烁,绿灯跟随br-lan的网络活动而闪烁

--- istoreos-src/target/linux/rockchip/rk35xx/base-files/etc/board.d/01_leds 2024-02-26 19:08:59.016545500 +0800
+++ istoreos-ht2/target/linux/rockchip/rk35xx/base-files/etc/board.d/01_leds 2024-03-06 16:21:49.686495300 +0800
@@ -45,6 +45,10 @@
ucidef_set_led_netdev "wan" "WAN" "yellow:led3" "eth1"
ucidef_set_led_netdev "lan" "LAN" "blue:led4" "eth0"
;;
+hlink,ht2)
+ ucidef_set_led_netdev "wan" "WAN" "led_blue" "eth0"
+ ucidef_set_led_netdev "lan" "LAN" "led_green" "br-lan"
+ ;;
lyt,t68m)
ucidef_set_led_timer "health" "health" "t68m:red:user" "200" "800"
;;
  1. 网口配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 照抄的H28K,后期再来修改

--- istoreos-src/target/linux/rockchip/rk35xx/base-files/etc/board.d/02_network 2024-02-26 19:08:59.016545500 +0800
+++ istoreos-ht2/target/linux/rockchip/rk35xx/base-files/etc/board.d/02_network 2024-02-24 23:28:22.140863500 +0800
@@ -43,6 +43,9 @@
hlink,h28k)
ucidef_set_interfaces_lan_wan 'eth0' 'eth1'
;;
+ hlink,ht2)
+ ucidef_set_interface_lan "eth0"
+ ;;
inspur,ihec301)
ucidef_set_interface_wan "eth0"
ucidef_add_switch "switch0" \
@@ -86,6 +89,7 @@
friendlyelec,nanopi-r6s|\
friendlyelec,nanopi-r6c|\
hlink,h28k|\
+ hlink,ht2|\
hinlink,h88k-*|\
hinlink,h88k|\
hinlink,opc-h69k|\
  1. 初始化设置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 照抄的H28K,后期再来修改

--- istoreos-src/target/linux/rockchip/rk35xx/base-files/lib/board/init.sh 2024-02-26 19:08:59.017545400 +0800
+++ istoreos-ht2/target/linux/rockchip/rk35xx/base-files/lib/board/init.sh 2024-03-04 15:39:41.833256600 +0800
@@ -264,6 +264,9 @@
set_iface_cpumask 5 eth0
set_iface_cpumask b eth1
;;
+ hlink,ht2)
+ set_iface_cpumask 5 eth0
+ ;;
ynn,nas|\
le,hes30|\
jp,tvbox|\
  1. OTA更新
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 照抄的H28K,后期再来修改

--- istoreos-src/target/linux/rockchip/rk35xx/base-files/lib/upgrade/ota.sh 2024-02-26 19:08:59.018545600 +0800
+++ istoreos-ht2/target/linux/rockchip/rk35xx/base-files/lib/upgrade/ota.sh 2024-02-24 23:34:49.600823700 +0800
@@ -35,6 +35,9 @@
hlink,h28k)
export -n OTA_URL_BASE="https://fw0.koolcenter.com/iStoreOS/h28k"
;;
+ hlink,ht2)
+ export -n OTA_URL_BASE="https://fw0.koolcenter.com/iStoreOS/ht2"
+ ;;
*)
return 1
;;
  1. 修改引导脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
# 不修改的话,内核在下面位置会卡死。只修改dts中ttyFIQ0为ttyS0是没用的,如后面修改就好
# [ 0.252354] ff9f0000.serial: ttyS0 at MMIO 0xff9f0000 (irq = 43, base_baud = 150000

--- istoreos-src/target/linux/rockchip/image/rk3528.bootscript 2024-03-04 18:25:33.803313000 +0800
+++ istoreos-ht2/target/linux/rockchip/image/rk3528.bootscript 2024-03-05 13:46:09.323497600 +0800
@@ -1,6 +1,6 @@
part uuid mmc ${devnum}:2 uuid

-setenv bootargs "earlycon=uart8250,mmio32,0xff9f0000 console=ttyFIQ0 root=PARTUUID=${uuid} rw rootwait"
+setenv bootargs "earlycon=uart8250,mmio32,0xff9f0000 console=ttyS0,1500000 root=PARTUUID=${uuid} rw rootwait"

load mmc ${devnum}:1 ${fdt_addr_r} rockchip.dtb
load mmc ${devnum}:1 ${kernel_addr_r} kernel.img
  1. 到此设备适配就完成了,后面开始无线驱动适配

驱动适配

  1. 获取来自 Armbian社区的AIC8800内核驱动
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
# 获取整个内核源码
git clone https://github.com/armbian/linux-rockchip.git

# 单独提出AIC8800的驱动到iStore
mkdir -p istoreos/target/linux/rockchip/files/drivers/net/wireless/
cp -r linux-rockchip/drivers/net/wireless/aic8800_sdio/ istoreos/target/linux/rockchip/files/drivers/net/wireless/


# 调整AIC8800驱动的设置:istoreos/target/linux/rockchip/files/drivers/net/wireless/aic8800_sdio/Kconfig

--- aic8800_sdio-src/Kconfig 2024-03-03 16:46:57.787015400 +0800
+++ aic8800_sdio-ht2/Kconfig 2024-03-05 21:34:59.372492100 +0800
@@ -1,5 +1,6 @@
config AIC_WLAN_SUPPORT
bool "AIC wireless Support"
+ select CFG80211
default n
help
This is support for aic wireless chip.
@@ -7,8 +8,7 @@
config AIC_FW_PATH
depends on AIC_WLAN_SUPPORT
string "Firmware & config file path"
- #default "/vendor/etc/firmware"
- default "/lib/firmware/aic8800/SDIO/aic8800D80/"
+ default "/lib/firmware/aic8800D80/"
help
Path to the firmware & config file.
  1. 添加AIC8800驱动到iStore内核菜单中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 将如下内容保存到:istoreos/target/linux/rockchip/patches-5.10/880-add-aic8800-Kconfig-Makefile.patch

--- a/drivers/net/wireless/Kconfig
+++ b/drivers/net/wireless/Kconfig
@@ -31,6 +31,7 @@
help you migrate to 4-addr AP/client (or, if it's really
necessary, give up on our plan of removing it).

+source "drivers/net/wireless/aic8800_sdio/Kconfig"
source "drivers/net/wireless/admtek/Kconfig"
source "drivers/net/wireless/ath/Kconfig"
source "drivers/net/wireless/atmel/Kconfig"
--- a/drivers/net/wireless/Makefile
+++ b/drivers/net/wireless/Makefile
@@ -3,6 +3,7 @@
# Makefile for the Linux Wireless network device drivers.
#

+obj-$(CONFIG_AIC_WLAN_SUPPORT) += aic8800_sdio/
obj-$(CONFIG_WLAN_VENDOR_ADMTEK) += admtek/
obj-$(CONFIG_WLAN_VENDOR_ATH) += ath/
obj-$(CONFIG_WLAN_VENDOR_ATMEL) += atmel/
  1. 解决添加AIC8800驱动后编译时出现的内核 Restart config...
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
# 将如下内容添加到该文件后面:istoreos/target/linux/rockchip/rk35xx/config-5.10
CONFIG_SYSTEM_DATA_VERIFICATION=y
CONFIG_CFG80211=y
CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y
CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y
CONFIG_CFG80211_DEFAULT_PS=y
CONFIG_CFG80211_CRDA_SUPPORT=y
CONFIG_SYSTEM_TRUSTED_KEYRING=y
CONFIG_SYSTEM_TRUSTED_KEYS=""
# CONFIG_NL80211_TESTMODE is not set
# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set
# CONFIG_CFG80211_CERTIFICATION_ONUS is not set
# CONFIG_CFG80211_DEBUGFS is not set
# CONFIG_CFG80211_WEXT is not set
# CONFIG_MAC80211 is not set
# CONFIG_USB_NET_RNDIS_WLAN is not set
# CONFIG_VIRT_WIFI is not set
# CONFIG_PRISM2_USB is not set
# CONFIG_RTL8723BS is not set
# CONFIG_R8712U is not set
# CONFIG_R8188EU is not set
# CONFIG_PKCS7_TEST_KEY is not set
# CONFIG_SIGNED_PE_FILE_VERIFICATION is not set
# CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set
# CONFIG_SECONDARY_TRUSTED_KEYRING is not set
  1. 添加AIC8800驱动包
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
29
30
31
32
33
34
35
36
37
38
39
40
41
# 将如下内容保存到:istoreos/package/kernel/linux/modules/hinlink.mk

NETWORK_DEVICES_MENU:=Network Devices

define KernelPackage/aic8800-wlan
SUBMENU:=$(NETWORK_DEVICES_MENU)
TITLE:=AIC8800 SDIO wireless module
KCONFIG:= \
CONFIG_AIC_INTF_SDIO=y \
CONFIG_AIC_WLAN_SUPPORT=y \
CONFIG_AIC_FW_PATH="/lib/firmware/aic8800D80/" \
CONFIG_AIC8800_WLAN_SUPPORT
FILES:= \
$(LINUX_DIR)/drivers/net/wireless/aic8800_sdio/aic8800_fdrv/aic8800_fdrv.ko \
$(LINUX_DIR)/drivers/net/wireless/aic8800_sdio/aic8800_bsp/aic8800_bsp.ko
AUTOLOAD:=$(call AutoProbe,aic8800_fdrv aic8800_bsp)
endef

define KernelPackage/aic8800-wlan/description
Kernel module for AIC8800 SDIO wireless module
endef

$(eval $(call KernelPackage,aic8800-wlan))

define KernelPackage/aic8800-bt
SUBMENU:=$(NETWORK_DEVICES_MENU)
TITLE:=AIC8800 SDIO bluetooth module
KCONFIG:= \
CONFIG_AIC_INTF_SDIO=y \
CONFIG_AIC_WLAN_SUPPORT=y \
CONFIG_AIC_FW_PATH="/lib/firmware/aic8800D80/" \
CONFIG_AIC8800_BTLPM_SUPPORT
FILES:=$(LINUX_DIR)/drivers/net/wireless/aic8800_sdio/aic8800_btlpm/aic8800_btlpm.ko
AUTOLOAD:=$(call AutoProbe,aic8800_btlpm)
endef

define KernelPackage/aic8800-bt/description
Kernel module for AIC8800 SDIO bluetooth module
endef

$(eval $(call KernelPackage,aic8800-bt))
  1. 添加AIC8800固件包
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
29
30
31
32
33
34
35
36
# 首先获取固件文件并将其放到指定路径
git clone https://github.com/armbian/firmware.git
cp -r firmware/aic8800/SDIO/aic8800D80/* istoreos/package/firmware/aic8800-firmware/files/aic8800D80/


# 然后将如下内容保存到:istoreos/package/firmware/aic8800-firmware/Makefile

include $(TOPDIR)/rules.mk

PKG_NAME:=aic8800-firmware
PKG_RELEASE:=2

PKG_MAINTAINER:=leux <xxxxx@gmail.com>

include $(INCLUDE_DIR)/package.mk

define Package/aic8800-firmware-default
SECTION:=firmware
CATEGORY:=Firmware
endef

define Build/Compile
true
endef

define Package/aic8800-firmware
$(Package/aic8800-firmware-default)
TITLE:=AIC8800 Firmware
endef

define Package/aic8800-firmware/install
$(INSTALL_DIR) $(1)/lib/firmware/aic8800D80/
$(INSTALL_DATA) ./files/aic8800D80/* $(1)/lib/firmware/aic8800D80/
endef

$(eval $(call BuildPackage,aic8800-firmware))

无线自启

  1. 因为OPENWRT的WiFi默认关闭,所以更改下面文件指定行的1为0来开启WiFi
1
2
3
4
5
6
7
8
9
10
11
12
# 该文件在系统编译后镜像中所在路径:/lib/wifi/mac80211.sh
--- a/package/kernel/mac80211/files/lib/wifi/mac80211.sh
+++ b/package/kernel/mac80211/files/lib/wifi/mac80211.sh
@@ -174,7 +174,7 @@
set wireless.radio${devidx}.channel=${channel}
set wireless.radio${devidx}.band=${mode_band}
set wireless.radio${devidx}.htmode=$htmode
- set wireless.radio${devidx}.disabled=1
+ set wireless.radio${devidx}.disabled=0

set wireless.default_radio${devidx}=wifi-iface
set wireless.default_radio${devidx}.device=radio${devidx}
  1. 由于该无线网卡不支持部分AX参数,所以需要剔除它们
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
29
30
31
32
33
34
35
36
# 可以通过命令来删除行,该文件在系统编译后镜像中所在路径:/lib/netifd/wireless/mac80211.sh
sed -i '/he_mu_beamformer/d' package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
sed -i '/he_su_beamformer/d' package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh

# 也可以根据如下补丁修改
--- a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
+++ b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
@@ -42,9 +42,7 @@
su_beamformee \
mu_beamformer \
mu_beamformee \
- he_su_beamformer \
he_su_beamformee \
- he_mu_beamformer \
vht_txop_ps \
htc_vht \
rx_antenna_pattern \
@@ -405,9 +403,7 @@

if [ "$enable_ax" != "0" ]; then
json_get_vars \
- he_su_beamformer:1 \
he_su_beamformee:0 \
- he_mu_beamformer:1 \
he_twt_required:0 \
he_spr_sr_control:0 \
he_spr_non_srg_obss_pd_max_offset:1 \
@@ -426,9 +422,7 @@
}

mac80211_add_he_capabilities \
- he_su_beamformer:${he_phy_cap:6:2}:0x80:$he_su_beamformer \
he_su_beamformee:${he_phy_cap:8:2}:0x1:$he_su_beamformee \
- he_mu_beamformer:${he_phy_cap:8:2}:0x2:$he_mu_beamformer \
he_spr_sr_control:${he_phy_cap:14:2}:0x1:$he_spr_sr_control \
he_twt_required:${he_mac_cap:0:2}:0x6:$he_twt_required
  1. 无线热点默认不建议开,因为AIC8800性能太拉,不过用来SSH也是不错的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 给个配置文件供参考:/etc/config/wireless

config wifi-device 'radio0'
option type 'mac80211'
option path 'platform/ffc10000.mmc/mmc_host/mmc2/mmc2:390b/mmc2:390b:1'
option channel '36'
option band '5g'
option htmode 'HE80'
option country 'US'

config wifi-iface 'default_radio0'
option device 'radio0'
option network 'lan'
option mode 'ap'
option ssid 'OpenWrt'
option encryption 'none'