add spacemit k1 platform support

1. add k1-sbc and k1-nas as solutions demo
This commit is contained in:
maguoqun 2024-06-27 20:53:27 +08:00
parent a2c1580036
commit 1bed103474
53 changed files with 9955 additions and 6 deletions

View file

@ -2,3 +2,4 @@ src-git packages https://git.openwrt.org/feed/packages.git;openwrt-23.05
src-git luci https://git.openwrt.org/project/luci.git;openwrt-23.05
src-git routing https://git.openwrt.org/feed/routing.git;openwrt-23.05
src-git telephony https://git.openwrt.org/feed/telephony.git;openwrt-23.05
src-git spacemit_openwrt_feeds https://gitee.com/bianbu-linux/spacemit-openwrt-feeds.git;k1-dev

View file

@ -26,11 +26,12 @@ remove_uri_prefix=$(subst git://,,$(subst http://,,$(subst https://,,$(1))))
sanitize_uri=$(call qstrip,$(subst @,_,$(subst :,_,$(subst .,_,$(subst -,_,$(subst /,_,$(1)))))))
ifneq ($(call qstrip,$(CONFIG_KERNEL_GIT_CLONE_URI)),)
LINUX_VERSION:=$(call sanitize_uri,$(call remove_uri_prefix,$(CONFIG_KERNEL_GIT_CLONE_URI)))
ifeq ($(call qstrip,$(CONFIG_KERNEL_GIT_REF)),)
CONFIG_KERNEL_GIT_REF:=HEAD
endif
LINUX_VERSION:=$(LINUX_VERSION)-$(call sanitize_uri,$(CONFIG_KERNEL_GIT_REF))
# LINUX_VERSION:=$(call sanitize_uri,$(call remove_uri_prefix,$(CONFIG_KERNEL_GIT_CLONE_URI)))
# ifeq ($(call qstrip,$(CONFIG_KERNEL_GIT_REF)),)
# CONFIG_KERNEL_GIT_REF:=HEAD
# endif
# LINUX_VERSION:=$(LINUX_VERSION)-$(call sanitize_uri,$(CONFIG_KERNEL_GIT_REF))
LINUX_VERSION:=$(KERNEL_PATCHVER)$(strip $(LINUX_VERSION-$(KERNEL_PATCHVER)))
else
ifdef KERNEL_PATCHVER
LINUX_VERSION:=$(KERNEL_PATCHVER)$(strip $(LINUX_VERSION-$(KERNEL_PATCHVER)))

View file

@ -0,0 +1,96 @@
# SPDX-License-Identifier: GPL-2.0-only
#
# Copyright (C) 2024 Spacemit Ltd.
#
include $(TOPDIR)/rules.mk
INTERNAL_ENV:=$(shell echo $${OPENWRT_INTERNAL_ENV})
ifeq ($(INTERNAL_ENV), yes)
PKG_NAME:=local_opensbi
PKG_RELEASE:=1
PKG_VERSION:=1.3
LOCAL_SOURCE_DIR=$(TOPDIR)/../bsp-src/opensbi
else
PKG_NAME:=opensbi
PKG_RELEASE:=1
PKG_VERSION:=1.3
PKG_SOURCE_VERSION:=v1.0.3
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL=https://gitee.com/bianbu-linux/opensbi.git
PKG_MIRROR_HASH:=skip
endif
PKG_TARGETS:=bin
PKG_FLAGS:=nonshared
PKG_LICENSE:=BSD-2-Clause
PKG_LICENSE_FILES:=COPYING.BSD
PKG_BUILD_PARALLEL:=1
include $(INCLUDE_DIR)/package.mk
define Package/opensbi
SECTION:=boot
CATEGORY:=Boot Loaders
DEPENDS:=@TARGET_spacemit
VARIANT:=$(subst _,/,$(subst opensbi_,,$(1)))
TITLE:=Spacemit customized version of OpenSBI
OPENSBI_IMAGE:=
PLAT:=
endef
define Package/opensbi_spacemit
$(Package/opensbi)
TITLE:=Spacemit customized version of OpenSBI
OPENSBI_IMAGE:=fw_dynamic.itb
PLAT:=generic
endef
export GCC_HONOUR_COPTS=s
MAKE_VARS = \
CROSS_COMPILE="$(TARGET_CROSS)"
ifeq ($(INTERNAL_ENV), yes)
define Build/Compile
$(eval $(Package/opensbi_$(BUILD_VARIANT))) \
+$(MAKE_VARS) $(MAKE) -C $(LOCAL_SOURCE_DIR) \
PLATFORM=$(PLAT) PLATFORM_DEFCONFIG=k1_defconfig
endef
define Build/Clean
$(MAKE) -C $(LOCAL_SOURCE_DIR) clean
endef
define Build/InstallDev
$(INSTALL_DIR) $(STAGING_DIR_IMAGE)
$(CP) $(LOCAL_SOURCE_DIR)/build/platform/$(PLAT)/firmware/fw_dynamic.itb $(STAGING_DIR_IMAGE)/
endef
$(eval $(call BuildPackage,opensbi_spacemit))
else
define Build/Compile
$(eval $(Package/opensbi_$(BUILD_VARIANT))) \
+$(MAKE_VARS) $(MAKE) -C $(PKG_BUILD_DIR) \
PLATFORM=$(PLAT) PLATFORM_DEFCONFIG=k1_defconfig
endef
define Build/Clean
$(MAKE) -C $(PKG_BUILD_DIR) clean
endef
define Build/InstallDev
$(INSTALL_DIR) $(STAGING_DIR_IMAGE)
$(CP) $(PKG_BUILD_DIR)/build/platform/$(PLAT)/firmware/fw_dynamic.itb $(STAGING_DIR_IMAGE)/
endef
$(eval $(call BuildPackage,opensbi_spacemit))
endif

View file

@ -0,0 +1,94 @@
# SPDX-License-Identifier: GPL-2.0-only
#
# Copyright (C) 2024 Spacemit LTD.
#
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
INTERNAL_ENV:=$(shell echo $${OPENWRT_INTERNAL_ENV})
ifeq ($(INTERNAL_ENV), yes)
PKG_SOURCE_PROTO:=local
PKG_RELEASE:=1
PKG_VERSION:=2022.10
LOCAL_SOURCE_DIR=$(TOPDIR)/../bsp-src/uboot-2022.10
else
PKG_RELEASE:=1
PKG_VERSION:=2022.10
PKG_SOURCE_VERSION:=v1.0.3
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL=https://gitee.com/bianbu-linux/uboot-2022.10.git
PKG_MIRROR_HASH:=skip
endif
include $(INCLUDE_DIR)/u-boot.mk
include $(INCLUDE_DIR)/package.mk
define U-Boot/Default
BUILD_TARGET:=spacemit
BUILD_DEVICES=$(1)
UBOOT_IMAGE:=u-boot.itb
DTS_DIR:=arch/riscv/dts
UENV:=default
DEFAULT:=y
endef
define U-Boot/k1
NAME:=K1 deb1
OPENSBI:=generic
DEPENDS:=+opensbi_spacemit
BUILD_DEVICES:=k1_deb1
endef
UBOOT_TARGETS := \
k1
ifeq ($(INTERNAL_ENV), yes)
define Build/Configure
$(MAKE) -C $(LOCAL_SOURCE_DIR) k1_defconfig
endef
define Build/Compile
+$(UBOOT_MAKE_FLAGS) $(MAKE) -j4 CROSS_COMPILE=$(TARGET_CROSS) -C $(LOCAL_SOURCE_DIR)
endef
define Build/Clean
$(MAKE) -C $(LOCAL_SOURCE_DIR) clean
endef
define Build/InstallDev
$(INSTALL_DIR) $(STAGING_DIR_IMAGE)
$(INSTALL_DIR) $(STAGING_DIR_IMAGE)/factory
$(INSTALL_BIN) $(LOCAL_SOURCE_DIR)/$(UBOOT_IMAGE) $(STAGING_DIR_IMAGE)/
$(INSTALL_BIN) $(LOCAL_SOURCE_DIR)/$(UBOOT_IMAGE) $(PKG_BUILD_DIR)/
$(INSTALL_BIN) $(LOCAL_SOURCE_DIR)/FSBL.bin $(STAGING_DIR_IMAGE)/factory/
$(INSTALL_BIN) $(LOCAL_SOURCE_DIR)/bootinfo*.bin $(STAGING_DIR_IMAGE)/factory/
$(INSTALL_BIN) $(LOCAL_SOURCE_DIR)/u-boot-env-default.bin $(STAGING_DIR_IMAGE)/env.bin
endef
else
define Build/Configure
$(call Build/Configure/U-Boot)
$(MAKE) -C $(PKG_BUILD_DIR) k1_defconfig
endef
define Build/InstallDev
$(INSTALL_DIR) $(STAGING_DIR_IMAGE)
$(INSTALL_DIR) $(STAGING_DIR_IMAGE)/factory
$(INSTALL_BIN) $(PKG_BUILD_DIR)/$(UBOOT_IMAGE) $(STAGING_DIR_IMAGE)/
$(INSTALL_BIN) $(PKG_BUILD_DIR)/FSBL.bin $(STAGING_DIR_IMAGE)/factory/
$(INSTALL_BIN) $(PKG_BUILD_DIR)/bootinfo*.bin $(STAGING_DIR_IMAGE)/factory/
$(INSTALL_BIN) $(PKG_BUILD_DIR)/u-boot-env-default.bin $(STAGING_DIR_IMAGE)/env.bin
endef
endif
$(eval $(call BuildPackage/U-Boot))

View file

@ -111,7 +111,12 @@ endef
DL_DIR=$(if $(call qstrip,$(CONFIG_DOWNLOAD_FOLDER)),$(call qstrip,$(CONFIG_DOWNLOAD_FOLDER)),$(TOPDIR)/dl)$(if $(DL_SUBDIR),/$(DL_SUBDIR))
OUTPUT_DIR:=$(if $(call qstrip,$(CONFIG_BINARY_FOLDER)),$(call qstrip,$(CONFIG_BINARY_FOLDER)),$(TOPDIR)/bin)
BIN_DIR:=$(OUTPUT_DIR)/targets/$(BOARD)/$(SUBTARGET)
ifeq ($(BOARD),spacemit)
TARGET_PROFILE:=$(call qstrip,$(CONFIG_TARGET_PROFILE))
BIN_DIR:=$(OUTPUT_DIR)/targets/$(BOARD)/$(TARGET_PROFILE)
else
BIN_DIR:=$(OUTPUT_DIR)/targets/$(BOARD)/$(SUBTARGET)
endif
INCLUDE_DIR:=$(TOPDIR)/include
SCRIPT_DIR:=$(TOPDIR)/scripts
BUILD_DIR_BASE:=$(TOPDIR)/build_dir

View file

@ -0,0 +1,30 @@
# SPDX-License-Identifier: GPL-2.0-only
#
# Copyright (C) 2024 Spacemit Ltd.
#
include $(TOPDIR)/rules.mk
ARCH:=riscv64
BOARD:=spacemit
BOARDNAME:=Spacemit RISC-V Chipsets
FEATURES:=ext4
KERNELNAME:=Image dtbs
SUBTARGETS:=k1-nas k1-sbc
KERNEL_PATCHVER:=6.1
INTERNAL_ENV:=$(shell echo $${OPENWRT_INTERNAL_ENV})
ifeq ($(INTERNAL_ENV), yes)
CONFIG_EXTERNAL_KERNEL_TREE=$(TOPDIR)/../bsp-src/linux-6.1
CONFIG_KERNEL_GIT_CLONE_URI=""
endif
include $(INCLUDE_DIR)/target.mk
DEFAULT_PACKAGES += mkf2fs e2fsprogs
define Target/Description
Build firmware images for the SpaceMit K1 boards
endef
$(eval $(call BuildTarget))

View file

@ -0,0 +1,20 @@
-----BEGIN CERTIFICATE-----
MIIDVzCCAj+gAwIBAgIQejBh5AwCG6hOlck2vgHb5jANBgkqhkiG9w0BAQsFADA9
MRMwEQYKCZImiZPyLGQBGRYDY29tMRIwEAYKCZImiZPyLGQBGRYCZGMxEjAQBgNV
BAMTCWRjLmNvbS1DQTAgFw0yMTA5MDQxMDI1MTJaGA8zMDIwMDkwNDEwMzUxMlow
PTETMBEGCgmSJomT8ixkARkWA2NvbTESMBAGCgmSJomT8ixkARkWAmRjMRIwEAYD
VQQDEwlkYy5jb20tQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCd
wb/A4opys55DJSjdmGJSNiaO2JnMg4A7loD0JQx2kHGv4UzEq5xtMcj0moLygPWM
l9PvVKuvUcsCn3erS+z/eHKTshx7tR3OQXNwiyLkEaSamaz1T7L1omwFFQMo6KbU
AoS9eT+UchWYiqvOMBFcl3I6gQ/id6yrATqQPSDLr3LZUcLlpT7KRLOuEJVQBZq8
oZIunnIZX9VMJ809kh59v6yrl/E/4qO2E81BtMDxx+60/ruE/bXw/1VFvFjzLmo+
BsdBXz3/r+pAFtmzkyf8cvo9oR0eLArgqnAEmP94inX1du+m4R9atke1Q/T2B3+l
sK2rf2rv5fZjnGO+y+6VAgMBAAGjUTBPMAsGA1UdDwQEAwIBhjAPBgNVHRMBAf8E
BTADAQH/MB0GA1UdDgQWBBQ88H9bZtRNRutzKs/xVyRFTDtJoTAQBgkrBgEEAYI3
FQEEAwIBADANBgkqhkiG9w0BAQsFAAOCAQEAVWVridVRQNpID73Pe7h+XYurur/F
xhzeHQRrPcUmob91fDQj1Ijhd0Ot6Y3NF51ZUAFrZz0CI87rJmY6/P61YK/LW5RC
javAIolbB9bTr5He8l1okFIxIeUXloe44dkL0ZR9IC3so+qi9TJ92iYLYlXTV64X
plthAWu4UR8p5zQ3wpO+8aaHtGCRMKw9+ZWRLRa1h2VFIxe4KZ4Yc4Kyr6d1rAuz
Mto3LymCgAX7qIDvOwp+Yy+htBbg/8VFyEkty/ZdWtOcyZR7jwSfu0dl2GKK0QtX
hiNDqQqaC91Oalm/TiZmEQzygWe6slwzpg3aTTlbMqhlfkF3Ynpg91w2yQ==
-----END CERTIFICATE-----

View file

@ -0,0 +1,7 @@
#!/bin/sh
echo "custom init env"
ln -s /lib/libc.so /usr/lib/libc.so
exit 0

View file

@ -0,0 +1,4 @@
#!/bin/sh
cat /etc/ssl/certs/dc.com-CA-Root-Base64.crt >> /etc/ssl/certs/ca-certificates.crt
exit 0

View file

@ -0,0 +1,760 @@
// SPDX-License-Identifier: (GPL-2.0 OR MIT)
/* Copyright (c) 2023 Spacemit, Inc */
/dts-v1/;
#include "spacemit/k1-x.dtsi"
#include "spacemit/k1-x_pinctrl.dtsi"
/ {
model = "spacemit k1-x MUSE-N1 board";
compatible = "spacemit,MUSE-N1", "spacemit,k1-x";
cpus: cpus {
#address-cells = <1>;
#size-cells = <0>;
timebase-frequency = <24000000>;
cpu_0: cpu@0 {
cpu-ai = "true";
};
cpu_1: cpu@1 {
cpu-ai = "true";
};
cpu_2: cpu@2 {
reg = <2>;
cpu-ai = "true";
};
cpu_3: cpu@3 {
reg = <3>;
cpu-ai = "true";
};
cpu-map {
cluster0 {
core0 {
cpu = <&cpu_0>;
};
core1 {
cpu = <&cpu_1>;
};
core2 {
cpu = <&cpu_2>;
};
core3 {
cpu = <&cpu_3>;
};
};
cluster1 {
core0 {
cpu = <&cpu_4>;
};
core1 {
cpu = <&cpu_5>;
};
core2 {
cpu = <&cpu_6>;
};
core3 {
cpu = <&cpu_7>;
};
};
};
};
memory@0 {
device_type = "memory";
reg = <0x0 0x00000000 0x0 0x80000000>;
};
memory@100000000 {
device_type = "memory";
reg = <0x1 0x00000000 0x0 0x80000000>;
};
reserved-memory {
#address-cells = <2>;
#size-cells = <2>;
ranges;
linux,cma {
compatible = "shared-dma-pool";
/* alloc memory from 0x40000000~0x80000000 */
alloc-ranges = <0 0x40000000 0 0x40000000>;
/* size of cma buffer is 384MByte */
size = <0 0x18000000>;
/* start address is 1Mbyte aligned */
alignment = <0x0 0x100000>;
linux,cma-default;
/* besides hardware, dma for ex. buffer can be used by memory management */
reusable;
};
/* reserved 384K for dpu, including mmu table(256K) and cmdlist(128K) */
dpu_resv: dpu_reserved@2ff40000 {
compatible = "shared-dma-pool";
reg = <0x0 0x2ff40000 0x0 0x000C0000>;
no-map;
};
};
chosen {
bootargs = "earlycon=sbi console=ttyS0,115200n8 debug loglevel=8 swiotlb=65536 rdinit=/init";
stdout-path = "serial0:115200n8";
};
dc_12v: dc-12v {
compatible = "regulator-fixed";
regulator-name = "dc_12v";
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <12000000>;
regulator-max-microvolt = <12000000>;
};
vcc4v0_baseboard: vcc4v0-baseboard {
compatible = "regulator-fixed";
regulator-name = "vcc4v0_baseboard";
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <4000000>;
regulator-max-microvolt = <4000000>;
vin-supply = <&dc_12v>;
};
rf_pwrseq: rf-pwrseq {
compatible = "spacemit,rf-pwrseq";
//vdd-supply = <&ldo_7>;
//vdd_voltage = <3300000>;
io-supply = <&dcdc_3>;
io_voltage = <1800000>;
pwr-gpios = <&gpio 67 0>;
status = "okay";
wlan_pwrseq: wlan-pwrseq {
compatible = "spacemit,wlan-pwrseq";
regon-gpios = <&gpio 116 0>;
hostwake-gpios = <&gpio 66 0>;
};
bt_pwrseq: bt-pwrseq {
compatible = "spacemit,bt-pwrseq";
reset-gpios = <&gpio 63 0>;
};
};
leds {
compatible = "gpio-leds";
led1 {
label = "sys-led";
gpios = <&gpio 96 0>;
linux,default-trigger = "heartbeat";
default-state = "on";
status = "okay";
};
};
};
&uart0 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart0_2>;
status = "okay";
};
&uart2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart2>;
status = "okay";
};
&i2c2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c2_0>;
spacemit,i2c-fast-mode;
status = "okay";
eeprom@50{
compatible = "atmel,24c02";
reg = <0x50>;
#address-cells = <1>;
#size-cells = <1>;
power-domains = <&power K1X_PMU_DUMMY_PWR_DOMAIN>;
status = "disabled";
mac_address0: mac_address0@0 {
reg = <0x0 6>;
};
mac_address1: mac_address1@6 {
reg = <0x6 6>;
};
};
};
&i2c4 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c4_2>;
clock-frequency = <400000>;
status = "okay";
};
&i2c8 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c8>;
status = "okay";
spm8821@41 {
compatible = "spacemit,spm8821";
reg = <0x41>;
interrupt-parent = <&intc>;
interrupts = <64>;
status = "okay";
vcc_sys-supply = <&vcc4v0_baseboard>;
dcdc5-supply = <&dcdc_5>;
regulators {
compatible = "pmic,regulator,spm8821";
/* buck */
dcdc_1: DCDC_REG1 {
regulator-name = "dcdc1";
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <3450000>;
regulator-ramp-delay = <5000>;
regulator-always-on;
regulator-state-mem {
regulator-off-in-suspend;
regulator-suspend-microvolt = <650000>;
};
};
dcdc_2: DCDC_REG2 {
regulator-name = "dcdc2";
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <3450000>;
regulator-ramp-delay = <5000>;
regulator-always-on;
};
dcdc_3: DCDC_REG3 {
regulator-name = "dcdc3";
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <1800000>;
regulator-ramp-delay = <5000>;
regulator-always-on;
};
dcdc_4: DCDC_REG4 {
regulator-name = "dcdc4";
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <3300000>;
regulator-ramp-delay = <5000>;
regulator-always-on;
};
dcdc_5: DCDC_REG5 {
regulator-name = "dcdc5";
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <3450000>;
regulator-ramp-delay = <5000>;
regulator-always-on;
};
dcdc_6: DCDC_REG6 {
regulator-name = "dcdc6";
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <3450000>;
regulator-ramp-delay = <5000>;
regulator-always-on;
};
/* aldo */
ldo_1: LDO_REG1 {
regulator-name = "ldo1";
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <3400000>;
regulator-boot-on;
};
ldo_2: LDO_REG2 {
regulator-name = "ldo2";
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <3400000>;
};
ldo_3: LDO_REG3 {
regulator-name = "ldo3";
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <3400000>;
};
ldo_4: LDO_REG4 {
regulator-name = "ldo4";
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <3400000>;
};
/* dldo */
ldo_5: LDO_REG5 {
regulator-name = "ldo5";
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <3400000>;
regulator-boot-on;
};
ldo_6: LDO_REG6 {
regulator-name = "ldo6";
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <3400000>;
};
ldo_7: LDO_REG7 {
regulator-name = "ldo7";
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <3400000>;
};
ldo_8: LDO_REG8 {
regulator-name = "ldo8";
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <3400000>;
regulator-always-on;
};
ldo_9: LDO_REG9 {
regulator-name = "ldo9";
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <3400000>;
};
ldo_10: LDO_REG10 {
regulator-name = "ldo10";
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <3400000>;
regulator-always-on;
};
ldo_11: LDO_REG11 {
regulator-name = "ldo11";
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <3400000>;
};
sw_1: SWITCH_REG1 {
regulator-name = "switch1";
};
};
pmic_pinctrl: pinctrl {
compatible = "pmic,pinctrl,spm8821";
gpio-controller;
#gpio-cells = <2>;
spacemit,npins = <6>;
/**
* led_pins: led-pins {
* pins = "PIN3";
* function = "sleep";
* bias-disable = <0>;
* drive-open-drain = <0x1>;
* };
*/
};
pwr_key: key {
compatible = "pmic,pwrkey,spm8821";
};
ext_rtc: rtc {
compatible = "pmic,rtc,spm8821";
};
};
};
&pinctrl {
pinctrl-single,gpio-range = <
&range GPIO_49 2 (MUX_MODE0 | EDGE_NONE | PULL_UP | PAD_3V_DS4)
&range GPIO_58 1 (MUX_MODE0 | EDGE_NONE | PULL_DOWN | PAD_1V8_DS2)
&range GPIO_63 2 (MUX_MODE0 | EDGE_NONE | PULL_DOWN | PAD_1V8_DS2)
&range GPIO_65 1 (MUX_MODE0 | EDGE_NONE | PULL_UP | PAD_1V8_DS2)
&range GPIO_66 2 (MUX_MODE0 | EDGE_NONE | PULL_DOWN | PAD_1V8_DS2)
&range GPIO_75 1 (MUX_MODE0 | EDGE_NONE | PULL_UP | PAD_1V8_DS2)
&range GPIO_90 1 (MUX_MODE0 | EDGE_NONE | PULL_DOWN | PAD_1V8_DS2)
&range GPIO_110 1 (MUX_MODE0 | EDGE_NONE | PULL_DOWN | PAD_1V8_DS2)
&range GPIO_115 2 (MUX_MODE0 | EDGE_NONE | PULL_DOWN | PAD_1V8_DS2)
&range GPIO_118 2 (MUX_MODE0 | EDGE_NONE | PULL_DOWN | PAD_1V8_DS2)
&range GPIO_125 1 (MUX_MODE0 | EDGE_NONE | PULL_DOWN | PAD_1V8_DS2)
&range GPIO_127 1 (MUX_MODE0 | EDGE_NONE | PULL_DOWN | PAD_1V8_DS2)
>;
pinctrl_gmac0: gmac0_grp {
pinctrl-single,pins =<
K1X_PADCONF(GPIO_00, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS2)) /* gmac0_rxdv */
K1X_PADCONF(GPIO_01, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS2)) /* gmac0_rx_d0 */
K1X_PADCONF(GPIO_02, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS2)) /* gmac0_rx_d1 */
K1X_PADCONF(GPIO_03, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS2)) /* gmac0_rx_clk */
K1X_PADCONF(GPIO_04, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS2)) /* gmac0_rx_d2 */
K1X_PADCONF(GPIO_05, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS2)) /* gmac0_rx_d3 */
K1X_PADCONF(GPIO_06, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS2)) /* gmac0_tx_d0 */
K1X_PADCONF(GPIO_07, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS2)) /* gmac0_tx_d1 */
K1X_PADCONF(GPIO_08, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS2)) /* gmac0_tx */
K1X_PADCONF(GPIO_09, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS2)) /* gmac0_tx_d2 */
K1X_PADCONF(GPIO_10, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS2)) /* gmac0_tx_d3 */
K1X_PADCONF(GPIO_11, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS2)) /* gmac0_tx_en */
K1X_PADCONF(GPIO_12, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS0)) /* gmac0_mdc */
K1X_PADCONF(GPIO_13, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS0)) /* gmac0_mdio */
K1X_PADCONF(GPIO_14, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS2)) /* gmac0_int_n */
K1X_PADCONF(GPIO_45, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS2)) /* gmac0_clk_ref */
>;
};
pinctrl_gmac1: gmac1_grp {
pinctrl-single,pins =<
K1X_PADCONF(GPIO_29, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS2)) /* gmac1_rxdv */
K1X_PADCONF(GPIO_30, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS2)) /* gmac1_rx_d0 */
K1X_PADCONF(GPIO_31, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS2)) /* gmac1_rx_d1 */
K1X_PADCONF(GPIO_32, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS2)) /* gmac1_rx_clk */
K1X_PADCONF(GPIO_33, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS2)) /* gmac1_rx_d2 */
K1X_PADCONF(GPIO_34, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS2)) /* gmac1_rx_d3 */
K1X_PADCONF(GPIO_35, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS0)) /* gmac1_tx_d0 */
K1X_PADCONF(GPIO_36, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS0)) /* gmac1_tx_d1 */
K1X_PADCONF(GPIO_37, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS2)) /* gmac1_tx */
K1X_PADCONF(GPIO_38, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS0)) /* gmac1_tx_d2 */
K1X_PADCONF(GPIO_39, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS0)) /* gmac1_tx_d3 */
K1X_PADCONF(GPIO_40, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS0)) /* gmac1_tx_en */
K1X_PADCONF(GPIO_41, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS0)) /* gmac1_mdc */
K1X_PADCONF(GPIO_42, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS0)) /* gmac1_mdio */
K1X_PADCONF(GPIO_43, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS2)) /* gmac1_int_n */
K1X_PADCONF(GPIO_46, MUX_MODE1, (EDGE_NONE | PULL_DIS | PAD_1V8_DS2)) /* gmac1_clk_ref */
>;
};
};
&gpio{
gpio-ranges = <
&pinctrl 49 GPIO_49 2
&pinctrl 58 GPIO_58 1
&pinctrl 63 GPIO_63 5
&pinctrl 75 GPIO_75 1
&pinctrl 79 GPIO_79 1
&pinctrl 90 GPIO_90 1
&pinctrl 110 GPIO_110 1
&pinctrl 115 GPIO_115 2
&pinctrl 118 GPIO_118 2
&pinctrl 125 GPIO_125 1
&pinctrl 127 GPIO_127 1
>;
};
/* SD */
&sdhci0 {
pinctrl-names = "default","fast";
pinctrl-0 = <&pinctrl_mmc1>;
pinctrl-1 = <&pinctrl_mmc1_fast>;
bus-width = <4>;
cd-gpios = <&gpio 80 0>;
cd-inverted;
vmmc-supply = <&dcdc_4>;
vqmmc-supply = <&ldo_1>;
no-mmc;
no-sdio;
spacemit,sdh-host-caps-disable = <(
MMC_CAP_UHS_SDR12 |
MMC_CAP_UHS_SDR25
)>;
spacemit,sdh-quirks = <(
SDHCI_QUIRK_BROKEN_CARD_DETECTION |
SDHCI_QUIRK_INVERTED_WRITE_PROTECT |
SDHCI_QUIRK_BROKEN_TIMEOUT_VAL
)>;
spacemit,sdh-quirks2 = <(
SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
SDHCI_QUIRK2_BROKEN_PHY_MODULE |
SDHCI_QUIRK2_SET_AIB_MMC
)>;
spacemit,aib_mmc1_io_reg = <0xD401E81C>;
spacemit,apbc_asfar_reg = <0xD4015050>;
spacemit,apbc_assar_reg = <0xD4015054>;
spacemit,rx_dline_reg = <0x0>;
spacemit,tx_dline_reg = <0x0>;
spacemit,tx_delaycode = <0x7f>;
spacemit,rx_tuning_limit = <50>;
spacemit,sdh-freq = <204800000>;
status = "okay";
};
/* SDIO */
&sdhci1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_mmc2>;
bus-width = <4>;
non-removable;
vqmmc-supply = <&dcdc_3>;
no-mmc;
no-sd;
keep-power-in-suspend;
/* bcmdhd use private oob solution rather than dat1/standard wakeup */
/delete-property/ enable-sdio-wakeup;
spacemit,sdh-host-caps-disable = <(
MMC_CAP_UHS_DDR50 |
MMC_CAP_NEEDS_POLL
)>;
spacemit,sdh-quirks = <(
SDHCI_QUIRK_BROKEN_CARD_DETECTION |
SDHCI_QUIRK_BROKEN_TIMEOUT_VAL
)>;
spacemit,sdh-quirks2 = <(
SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
SDHCI_QUIRK2_BROKEN_PHY_MODULE
)>;
spacemit,rx_dline_reg = <0x0>;
spacemit,rx_tuning_limit = <50>;
spacemit,sdh-freq = <375000000>;
status = "okay";
};
/* eMMC */
&sdhci2 {
bus-width = <8>;
non-removable;
mmc-hs400-1_8v;
mmc-hs400-enhanced-strobe;
no-sd;
no-sdio;
spacemit,sdh-quirks = <(
SDHCI_QUIRK_BROKEN_CARD_DETECTION |
SDHCI_QUIRK_BROKEN_TIMEOUT_VAL
)>;
spacemit,sdh-quirks2 = <(
SDHCI_QUIRK2_PRESET_VALUE_BROKEN
)>;
spacemit,sdh-freq = <375000000>;
status = "okay";
};
&eth0 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gmac0>;
emac,reset-gpio = <&gpio 110 0>;
emac,reset-active-low;
emac,reset-delays-us = <0 10000 100000>;
/* store forward mode */
tx-threshold = <1518>;
rx-threshold = <12>;
tx-ring-num = <1024>;
rx-ring-num = <1024>;
dma-burst-len = <5>;
ref-clock-from-phy;
clk-tuning-enable;
clk-tuning-by-delayline;
tx-phase = <60>;
rx-phase = <73>;
nvmem-cells = <&mac_address0>;
nvmem-cell-names = "mac-address";
phy-handle = <&rgmii0>;
status = "okay";
mdio-bus {
#address-cells = <0x1>;
#size-cells = <0x0>;
rgmii0: phy@0 {
compatible = "ethernet-phy-id001c.c916";
device_type = "ethernet-phy";
reg = <0x1>;
phy-mode = "rgmii";
};
};
};
&eth1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gmac1>;
emac,reset-gpio = <&gpio 115 0>;
emac,reset-active-low;
emac,reset-delays-us = <0 10000 100000>;
/* store forward mode */
tx-threshold = <1518>;
rx-threshold = <12>;
tx-ring-num = <1024>;
rx-ring-num = <1024>;
dma-burst-len = <5>;
ref-clock-from-phy;
clk-tuning-enable;
clk-tuning-by-delayline;
tx-phase = <90>;
rx-phase = <73>;
nvmem-cells = <&mac_address1>;
nvmem-cell-names = "mac-address";
phy-handle = <&rgmii1>;
status = "okay";
mdio-bus {
#address-cells = <0x1>;
#size-cells = <0x0>;
rgmii1: phy@1 {
compatible = "ethernet-phy-id001c.c916";
device_type = "ethernet-phy";
reg = <0x1>;
phy-mode = "rgmii";
};
};
};
&usbphy {
status = "okay";
};
&udc {
/*spacemit,udc-mode = <MV_USB_MODE_OTG>;
spacemit,extern-attr = <MV_USB_HAS_VBUS_IDPIN_DETECTION>;*/
spacemit,udc-mode = <MV_USB_MODE_UDC>;
status = "okay";
};
&usbphy1 {
status = "okay";
};
&ehci1 {
spacemit,reset-on-resume;
status = "okay";
};
&usb2phy {
status = "okay";
};
&combphy {
status = "okay";
};
&usb3hub {
vbus-gpios = <&gpio 127 0>; /* gpio_127 for usb1 vbus on */
status = "okay";
};
&usbdrd3 {
status = "okay";
reset-on-resume;
dwc3@c0a00000 {
dr_mode = "otg";
phy_type = "utmi";
snps,hsphy_interface = "utmi";
snps,dis_enblslpm_quirk;
snps,dis_u2_susphy_quirk;
snps,dis_u3_susphy_quirk;
snps,dis-del-phy-power-chg-quirk;
snps,dis-tx-ipgap-linecheck-quirk;
usb-role-switch;
role-switch-default-mode = "host";
};
};
&pcie1_rc {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_pcie1_3>;
status = "okay";
};
&pcie2_rc {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_pcie2_4>;
status = "okay";
};
&qspi {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_qspi>;
status = "okay";
flash@0 {
compatible = "jedec,spi-nor";
reg = <0>;
spi-max-frequency = <26500000>;
m25p,fast-read;
broken-flash-reset;
status = "okay";
};
};
&cpu_0 {
clst0-supply = <&dcdc_1>;
vin-supply-names = "clst0";
};
&clst0_core_opp_table {
opp1600000000 {
opp-microvolt = <1050000>;
};
};
&clst1_core_opp_table {
opp1600000000 {
opp-microvolt = <1050000>;
};
};
&rcpu {
mboxes = <&mailbox 0>, <&mailbox 1>;
mbox-names = "vq0", "vq1";
memory-region = <&rcpu_mem_0>, <&vdev0vring0>, <&vdev0vring1>, <&vdev0buffer>, <&rsc_table>, <&rcpu_mem_snapshots>;
status = "disabled";
};
&cls0_trip2 {
temperature = <115000>;
};
&cls1_trip2 {
temperature = <115000>;
};
&sound_hdmi {
status = "disabled";
};
&sound_codec {
status = "disabled";
};
&rpwm2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_rpwm2_0>;
status = "disabled";
};
&hdmi_dma {
status = "disabled";
};
&hdmi_sspa {
status = "disabled";
};

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,6 @@
#boot part size defined in partions_*.json file
#config SPACEMIT_SD_BOOT_PARTSIZE
# int "Boot (SD Card) filesystem partition size (in MB)"
# depends on TARGET_spacemit
# default 32

View file

@ -0,0 +1,59 @@
# SPDX-License-Identifier: GPL-2.0-only
#
# Copyright (C) 2024 Spacemit Ltd.
#
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/image.mk
#note Config.in together
#FAT32_BLOCK_SIZE=1024
#FAT32_BLOCKS=$(shell echo $$(($(CONFIG_SPACEMIT_SD_BOOT_PARTSIZE)*1024*1024/$(FAT32_BLOCK_SIZE))))
#get bootfs part size from json file, use partition_universal.json as sdcard partition table default
PARTITION_FILE=$(PWD)/image/partition_tables/partition_universal.json
BOOTFS_SIZE := $(shell jq -r '.partitions[] | select(.name=="bootfs") | .size' $(PARTITION_FILE))
BOOTFS_SIZE_KB := $(shell echo "$(BOOTFS_SIZE)" | sed 's/M/*1024/' | bc)
KERNEL_LOADADDR:=0x1400000
define Build/boot-common
rm -f $@.boot
mkfs.fat -n boot -C $@.boot $(BOOTFS_SIZE_KB)
#mcopy -i $@.boot $(KDIR_TMP)/$(KERNEL_INITRAMFS_IMAGE) ::$(KERNEL_IMG)
mcopy -i $@.boot $(IMAGE_KERNEL) ::$(KERNEL_IMG)
mcopy -i $@.boot env_k1-x.txt ::
$(foreach dts,$(shell echo $(DEVICE_DTS)),mcopy -i $@.boot $(KDIR)/image-$(dts).dtb ::$(dts).dtb;)
cp -rf $(STAGING_DIR_IMAGE)/* $(KDIR_TMP)/
endef
define Build/sdcard-img
./gen_spacemit_sdcard_img.sh $@ $@.boot $(IMAGE_ROOTFS) \
$(PARTITION_FILE) $(CONFIG_TARGET_ROOTFS_PARTSIZE)
cp $(KDIR_TMP)/*sdcard.img $(BIN_DIR)
endef
define Build/archive-zip
rm -f $@
cp -f $(IMAGE_ROOTFS) $(KDIR_TMP)/rootfs.ext4
cp -f $@.boot $(KDIR_TMP)/bootfs.img
cp -f partition_tables/* $(KDIR_TMP)/
./gen_spacemit_archive_zip.sh \
$@
endef
define Device/Default
PROFILES := Default
KERNEL_NAME := Image
KERNEL_IMG := Image.itb
KERNEL := kernel-bin | fit none
IMAGES := sdcard.img
IMAGE/sdcard.img := boot-common | sdcard-img
endef
include $(SUBTARGET).mk
$(eval $(call BuildImage))

View file

@ -0,0 +1,7 @@
# Common parameter
earlycon=sbi
console=ttyS0,115200
init=/init
bootdelay=0
loglevel=8

View file

@ -0,0 +1,62 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: GPL-2.0-only
#
# Copyright (C) 2024 Spacemit Ltd.
echo "gen zip file print"
#set -ex
set -e
[ $# -eq 1 ] || {
echo "SYNTAX: $0 <file> <partition_table json file> "
exit 1
}
#why openWRT do not use genimage? i have no idea
#To be compatible with buildroot which use genimage, a conversion is made here.
OUTPUT="$1"
IMGS_DIR=$(dirname $1)
#Give a chance to CI
if [ -z "$BIANBU_LINUX_ARCHIVE" ]; then
TARGET_IMAGE_ZIP=$OUTPUT
else
TARGET_IMAGE_ZIP="$BIANBU_LINUX_ARCHIVE.zip"
fi
#used by Spacemit's PC-burning-tool called Titan
#Titan features
# 1. Burning archive's image into storage(nor/flash/emmc/ssd) media on board via USB
# 2. Burning archive's image into SD card for booting card to boot device
# 3. Produce production cards to upgrade device on factory line
# 4. Use archive's image to gen sdcard.img
pack_image_zip() {
echo "Starting to pack images................................."
rm -f ${TARGET_IMAGE_ZIP}
cd ${IMGS_DIR}
zip ${TARGET_IMAGE_ZIP} \
fw_dynamic.itb \
u-boot.itb \
env.bin \
bootfs.img \
rootfs.ext4 \
partition_*.json \
fastboot.yaml \
genimage.cfg \
-r factory
#Give a chance to CI
if [ -n "$BIANBU_LINUX_ARCHIVE_LATEST" ]; then
ln -sf ${TARGET_IMAGE_ZIP} $BIANBU_LINUX_ARCHIVE_LATEST
fi
cd - >/dev/null
echo "Images successfully packed into ${TARGET_IMAGE_ZIP}"
echo -e "\n"
}
#Pack images in zip
pack_image_zip

View file

@ -0,0 +1,82 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: GPL-2.0-only
#
# Copyright (C) 2024 Spacemit Ltd.
echo "gen sdcard image print"
#set -ex
set -e
[ $# -eq 5 ] || {
echo "SYNTAX: $0 <file> <partition_table json file> "
exit 1
}
#why openWRT do not use genimage? i have no idea
#To be compatible with buildroot which use genimage, a conversion is made here.
OUTPUT="$1"
IMGS_DIR=$(dirname $1)
if echo "$1" |grep -q '\.zip$'; then
OUTPUT=$(echo "$1" |sed 's/\.zip$//')-sdcard.img
echo "new sdcard image name:$OUTPUT"
else
OUTPUT="$1-sdcard.img"
echo "set image name to sdcard.img"
fi
#Bootinfo contains only the first 80 bytes of valid data.
BOOTINFO=${IMGS_DIR}/$(jq '.partitions[] | select(.name == "bootinfo") | .image' "$4" | sed 's/["]//g')
FSBL=${IMGS_DIR}/$(jq '.partitions[] | select(.name == "fsbl") | .image' "$4" | sed 's/["]//g')
FSBL_SIZE=$(jq '.partitions[] | select(.name == "fsbl") | .size' "$4" | sed 's/["kK]//g')
FSBL_OFFSET=$(jq '.partitions[] | select(.name == "fsbl") | .offset' "$4" | sed 's/["kK]//g')
#if flash env.bin is optional, but env part must be fixed offset at 512k
UENV=${IMGS_DIR}/$(jq '.partitions[] | select(.name == "env") | .image' "$4" | sed 's/["]//g')
UENV_SIZE=$(jq '.partitions[] | select(.name == "env") | .size' "$4" | sed 's/["kK]//g')
UENV_OFFSET=$(jq '.partitions[] | select(.name == "env") | .offset' "$4" | sed 's/["kK]//g')
OPENSBI=${IMGS_DIR}/$(jq '.partitions[] | select(.name == "opensbi") | .image' "$4" | sed 's/["]//g')
OPENSBI_SIZE=$(jq '.partitions[] | select(.name == "opensbi") | .size' "$4" | sed 's/["kK]//g')
UBOOT=${IMGS_DIR}/$(jq '.partitions[] | select(.name == "uboot") | .image' "$4" | sed 's/["]//g')
UBOOT_SIZE=$(jq '.partitions[] | select(.name == "uboot") | .size' "$4" | sed 's/["mM]//g')
BOOTFS="$2"
#${IMGS_DIR}/$(jq '.partitions[] | select(.name == "bootfs") | .image' "$2" | sed 's/["]//g')
BOOTFS_SIZE=$(jq '.partitions[] | select(.name == "bootfs") | .size' "$4" | sed 's/["mM]//g')
ROOTFS="$3"
#${IMGS_DIR}/$(jq '.partitions[] | select(.name == "rootfs") | .image' "$2" | sed 's/["]//g')
ROOTFS_SIZE=$5
head=4
sect=63
#unit is kbytes default
set $(ptgen -o $OUTPUT -v -g -h $head -s $sect \
-N fsbl -p $FSBL_SIZE@$FSBL_OFFSET \
-N env -p $UENV_SIZE@$UENV_OFFSET \
-N opensbi -p $OPENSBI_SIZE \
-N uboot -p ${UBOOT_SIZE}M \
-N bootfs -p ${BOOTFS_SIZE}M \
-N rootfs -p ${ROOTFS_SIZE}M)
OPENSBI_OFFSET=$(($5 / 1024))
UBOOT_OFFSET=$(($7 / 1024))
BOOTFS_OFFSET=$(($9 / 1024))
ROOTFS_OFFSET=$((${11} / 1024))
#Bootinfo contains only the first 80 bytes of valid data.
dd bs=80 if="$BOOTINFO" of="$OUTPUT" seek=0 count=1 conv=notrunc
dd bs=1024 if="$FSBL" of="$OUTPUT" seek=${FSBL_OFFSET} conv=notrunc
dd bs=1024 if="$UENV" of="$OUTPUT" seek=${UENV_OFFSET} conv=notrunc
dd bs=1024 if="$OPENSBI" of="$OUTPUT" seek=${OPENSBI_OFFSET} conv=notrunc
dd bs=1024 if="$UBOOT" of="$OUTPUT" seek=${UBOOT_OFFSET} conv=notrunc
dd bs=1024 if="$BOOTFS" of="$OUTPUT" seek=${BOOTFS_OFFSET} conv=notrunc
dd bs=1024 if="$ROOTFS" of="$OUTPUT" seek=${ROOTFS_OFFSET} conv=notrunc
echo "$OUTPUT successfully generated"

View file

@ -0,0 +1,17 @@
# SPDX-License-Identifier: GPL-2.0-only
#
# Copyright (C) 2024 Spacemit Ltd.
define Device/MUSE-N1
DEVICE_VENDOR := Spacemit
DEVICE_MODEL := N1 nas
DEVICE_DTS_DIR:= ../dts
DEVICE_DTS := k1-x_MUSE-N1
SOC := KeyStone
KERNEL_NAME := Image
KERNEL_IMG := Image.itb
KERNEL := kernel-bin | fit none
IMAGES := pack.zip
IMAGE/pack.zip := $(KERNEL_IMG) | boot-common | archive-zip
endef
TARGET_DEVICES += MUSE-N1

View file

@ -0,0 +1,18 @@
# SPDX-License-Identifier: GPL-2.0-only
#
# Copyright (C) 2024 Spacemit Ltd.
define Device/debX
DEVICE_VENDOR := Spacemit
DEVICE_MODEL :=k1-x deb board
DEVICE_DTS_DIR:= ../dts
DEVICE_DTS := k1-x_deb1 k1-x_MUSE-Pi
SOC := KeyStone
KERNEL_NAME := Image
KERNEL_IMG := Image.itb
KERNEL := kernel-bin | fit none
IMAGES := pack.zip
IMAGE/pack.zip := $(KERNEL_IMG) | boot-common | sdcard-img | archive-zip
endef
TARGET_DEVICES += debX

View file

@ -0,0 +1,52 @@
version: 1.0 # 配置文件版本
support: # 支持的项目代号
- 'k1x'
- 'k1pro'
actions: # 刷机操作的定义
- getvar:
args: 'version-brom'
set: 'version'
skip_fail: true
timeout:
seconds: 1
- stage:
file: 'factory/FSBL.bin'
skip_when: "not temp.version"
timeout:
minutes: 2
- continue:
skip_when: "not temp.version"
timeout:
seconds: 1
- stage:
file: 'u-boot.itb'
skip_when: "not temp.version"
timeout:
minutes: 2
retry: 3
- continue:
skip_when: "not temp.version"
timeout:
seconds: 1
- getvar:
args: 'mtd-size'
set_var: 'size0'
timeout:
seconds: 1
- getvar:
args: 'blk-size'
set_var: 'size1'
timeout:
seconds: 1
- multi_flash:
timeout:
minutes: 10
relate_partition: ['partition_{size0}.json', 'partition_{size1}.json']

View file

@ -0,0 +1,67 @@
# This is a genimage configuration file auto generated by gen_imgcfg.py.
# require genimage version 16
image sdcard.img {
hdimage {
partition-table-type = gpt
}
partition bootinfo {
image = "factory/bootinfo_sd.bin"
offset = "0K"
size = "512"
holes = {"(80;512)"}
in-partition-table = "false"
}
partition fsbl {
image = "factory/FSBL.bin"
offset = "128K"
size = "256K"
holes = {}
in-partition-table = "true"
}
partition env {
image = "env.bin"
offset = "384K"
size = "64K"
holes = {}
in-partition-table = "true"
}
partition opensbi {
image = "fw_dynamic.itb"
offset = ""
size = "384K"
holes = {}
in-partition-table = "true"
}
partition uboot {
image = "u-boot.itb"
offset = ""
size = "2M"
holes = {}
in-partition-table = "true"
}
partition bootfs {
image = "bootfs.img"
offset = "4M"
size = "256M"
holes = {}
in-partition-table = "true"
}
partition rootfs {
image = "rootfs.ext4"
offset = "260M"
size = ""
holes = {}
in-partition-table = "true"
}
}

View file

@ -0,0 +1,36 @@
{
"version": "1.0",
"format": "mtd",
"partitions": [
{
"name": "bootinfo",
"comment": "private partition, should not overrided it",
"offset": "0",
"size": "128K",
"image": "factory/bootinfo_spinor.bin"
},
{
"name": "fsbl",
"offset": "128K",
"size": "256K",
"image": "factory/FSBL.bin"
},
{
"name": "env",
"offset": "384K",
"size": "64K"
},
{
"name": "opensbi",
"offset": "448K",
"size": "192K",
"image": "fw_dynamic.itb"
},
{
"name": "uboot",
"offset": "640K",
"size": "-",
"image": "u-boot.itb"
}
]
}

View file

@ -0,0 +1,51 @@
{
"version": "1.0",
"format": "gpt",
"partitions": [
{
"name": "bootinfo",
"offset": "0",
"size": "80B",
"image": "factory/bootinfo_sd.bin"
},
{
"name": "fsbl",
"offset": "128K",
"size": "256K",
"image": "factory/FSBL.bin"
},
{
"name": "env",
"offset": "384K",
"size": "64K"
},
{
"name": "opensbi",
"offset": "1M",
"size": "1M",
"image": "fw_dynamic.itb"
},
{
"name": "uboot",
"offset": "2M",
"size": "2M",
"image": "u-boot.itb"
},
{
"name": "bootfs",
"type": "FAT32",
"offset": "4M",
"size": "-",
"image": ["factory/bootinfo_emmc.bin",
"factory/bootinfo_spinand.bin",
"factory/bootinfo_spinor.bin",
"factory/FSBL.bin",
"fw_dynamic.itb",
"u-boot.itb",
"bootfs.img",
"rootfs.ext4",
"env.bin",
"/partition_.+.json$/"]
}
]
}

View file

@ -0,0 +1,51 @@
{
"version": "1.0",
"format": "gpt",
"partitions": [
{
"name": "bootinfo",
"hidden": true,
"offset": "0K",
"size": "512",
"image": "factory/bootinfo_sd.bin",
"holes": "{\"(80;512)\"}"
},
{
"name": "fsbl",
"hidden": false,
"offset": "128K",
"size": "256K",
"image": "factory/FSBL.bin"
},
{
"name": "env",
"offset":"384K",
"size": "64K",
"image": "env.bin"
},
{
"name": "opensbi",
"size": "384K",
"image": "fw_dynamic.itb"
},
{
"name": "uboot",
"size": "2M",
"image": "u-boot.itb"
},
{
"name": "bootfs",
"offset": "4M",
"size": "256M",
"image": "bootfs.img",
"compress": "gzip-5"
},
{
"name": "rootfs",
"offset": "260M",
"size": "-",
"image": "rootfs.ext4",
"compress": "gzip-5"
}
]
}

View file

@ -0,0 +1,18 @@
# SPDX-License-Identifier: GPL-2.0-only
#
# Copyright (C) 2022 OpenWrt.org
#
. /lib/functions/uci-defaults.sh
board_config_update
case "$(board_name)" in
spacemit,k1-x)
ucidef_set_led_netdev "wan" "WAN" "green:d3" "eth0"
;;
esac
board_config_flush
exit 0

View file

@ -0,0 +1,19 @@
# SPDX-License-Identifier: GPL-2.0-only
#
# Copyright (C) 2022 OpenWrt.org
#
. /lib/functions/uci-defaults.sh
board_config_update
case "$(board_name)" in
spacemit,MUSE-N1 )
ucidef_set_interface_lan 'eth0 eth1 wlan0'
ucidef_set_interface_wan 'eth2'
;;
esac
board_config_flush
exit 0

View file

@ -0,0 +1,14 @@
interface=wlan0
driver=nl80211
ctrl_interface=/var/run/hostapd
ssid=openWRT-AP
wpa_passphrase=12345678
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP TKIP
wpa_pairwise=TKIP CCMP
channel=6
ieee80211n=1
hw_mode=g
bridge=br-lan
ignore_broadcast_ssid=0

View file

@ -0,0 +1,6 @@
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
159.27.188.198 archive.spacemit.com

View file

@ -0,0 +1,13 @@
#!/bin/sh /etc/rc.common
#must after boot
START=99
start(){
hostapd -B /etc/hostapd.conf
}
stop(){
echo "hostapd needs to be stopped manually"
}
restart(){
echo "hostapd needs to be restart manually"
}

View file

@ -0,0 +1,4 @@
::sysinit:/etc/init.d/rcS S boot
::shutdown:/etc/init.d/rcS K shutdown
::askconsole:/usr/libexec/login.sh
ttyS0::askfirst:/usr/libexec/login.sh

View file

@ -0,0 +1,19 @@
# Copyright (C) 2012-2015 OpenWrt.org
move_config() {
local partdev
. /lib/upgrade/common.sh
if export_bootdevice && export_partdevice partdev 3; then
if mount -t vfat -o rw,noatime "/dev/$partdev" /mnt; then
if [ -f "/mnt/$BACKUP_FILE" ]; then
mv -f "/mnt/$BACKUP_FILE" /
fi
umount /mnt
fi
fi
}
boot_hook_add preinit_mount_root move_config

View file

@ -0,0 +1,86 @@
platform_check_image() {
local diskdev partdev diff
export_bootdevice && export_partdevice diskdev 0 || {
echo "Unable to determine upgrade device"
return 1
}
get_partitions "/dev/$diskdev" bootdisk
#extract the boot sector from the image
get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b 2>/dev/null
get_partitions /tmp/image.bs image
#compare tables
diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)"
rm -f /tmp/image.bs /tmp/partmap.bootdisk /tmp/partmap.image
if [ -n "$diff" ]; then
echo "Partition layout has changed. Full image will be written."
ask_bool 0 "Abort" && exit 1
return 0
fi
}
platform_copy_config() {
local partdev
if export_partdevice partdev 3; then
mount -t vfat -o rw,noatime "/dev/$partdev" /mnt
cp -af "$UPGRADE_BACKUP" "/mnt/$BACKUP_FILE"
umount /mnt
fi
}
platform_do_upgrade() {
local diskdev partdev diff
export_bootdevice && export_partdevice diskdev 0 || {
echo "Unable to determine upgrade device"
return 1
}
sync
if [ "$UPGRADE_OPT_SAVE_PARTITIONS" = "1" ]; then
get_partitions "/dev/$diskdev" bootdisk
#extract the boot sector from the image
get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b
get_partitions /tmp/image.bs image
#compare tables
diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)"
else
diff=1
fi
if [ -n "$diff" ]; then
get_image "$@" | dd of="/dev/$diskdev" bs=4096 conv=fsync
# Separate removal and addtion is necessary; otherwise, partition 1
# will be missing if it overlaps with the old partition 2
partx -d - "/dev/$diskdev"
partx -a - "/dev/$diskdev"
return 0
fi
#iterate over each partition from the image and write it to the boot disk
while read part start size; do
if export_partdevice partdev $part; then
echo "Writing image to /dev/$partdev..."
get_image "$@" | dd of="/dev/$partdev" ibs="512" obs=1M skip="$start" count="$size" conv=fsync
else
echo "Unable to find partition $part device, skipped."
fi
done < /tmp/partmap.image
#copy partition uuid
echo "Writing new UUID to /dev/$diskdev..."
get_image "$@" | dd of="/dev/$diskdev" bs=1 skip=440 count=4 seek=440 conv=fsync
}

View file

@ -0,0 +1,117 @@
#!/bin/sh
# configfs for bot mass-storage usb gadget
# should enable in Kconfig: target core, target core > fileio, f_msc
name=$(basename $0)
VENDOR_ID="0x361C"
PRODUC_ID="0x002f"
SERNUM_STR="20211102"
MANUAF_STR="Spacemit"
PRODUC_STR="K1 Mass Storage(BOT)"
# SCSI naa
CONFIGFS=/sys/kernel/config
GADGET_PATH=$CONFIGFS/usb_gadget/msc
GFUNC_PATH=$GADGET_PATH/functions
GCONFIG=$GADGET_PATH/configs/c.1
usage()
{
echo "$name Usage: "
echo ""
echo -e "\texample: $name start /dev/mmcblk1p1"
echo -e "\texample: $name stop"
echo ""
}
########################### Gadget ####################################msc#######
gadget_info()
{
echo "$name: $1"
}
gadget_debug()
{
[ $DEBUG ] && echo "$name: $1"
}
die()
{
gadget_info "$1"
exit 1
}
g_remove()
{
[ -h $1 ] && rm -f $1
[ -d $1 ] && rmdir $1
[ -e $1 ] && rm -f $1
}
enable_udc()
{
echo c0900100.udc > $GADGET_PATH/UDC
}
stop()
{
[ -e $GADGET_PATH/UDC ] || die "gadget not configured, no need to clean"
gadget_info "Echo none to udc"
[ -e $GADGET_PATH/UDC ] || die "gadget not configured yet"
[ `cat $GADGET_PATH/UDC` ] && echo "" > $GADGET_PATH/UDC
gadget_debug "clean msc"
gadget_debug "remove msc from usb config"
g_remove $GCONFIG/mass_storage.usb0
# Remove strings:
gadget_info "remove strings of c.1."
g_remove $GCONFIG/strings/0x409
# Remove config:
gadget_info "remove configs c.1."
g_remove $GCONFIG
g_remove $GFUNC_PATH/mass_storage.usb0
# Remove string in gadget
gadget_info "remove strings of $GADGET_PATH."
g_remove $GADGET_PATH/strings/0x409
# Remove gadget
gadget_info "remove $GADGET_PATH."
g_remove $GADGET_PATH
}
check()
{
DEVICE=$1
[ -n "$DEVICE" ] || die "No device specificed"
[ -b $DEVICE -o -f $DEVICE ] || die "Invalid device or file: ${DEVICE}"
}
start()
{
DEVICE=$1
gadget_info "config $VENDOR_ID/$PRODUC_ID/$SERNUM_STR/$MANUAF_STR/$PRODUC_STR."
mountpoint -q /sys/kernel/config || mount -t configfs none /sys/kernel/config
[ -e $GADGET_PATH ] && die "ERROR: gadget already configured, should run stop first"
mkdir $GADGET_PATH
echo $VENDOR_ID > $GADGET_PATH/idVendor
echo $PRODUC_ID > $GADGET_PATH/idProduct
mkdir $GADGET_PATH/strings/0x409
echo $SERNUM_STR > $GADGET_PATH/strings/0x409/serialnumber
echo $MANUAF_STR > $GADGET_PATH/strings/0x409/manufacturer
echo $PRODUC_STR > $GADGET_PATH/strings/0x409/product
mkdir $GCONFIG
echo 0xc0 > $GCONFIG/bmAttributes
echo 500 > $GCONFIG/MaxPower
mkdir $GCONFIG/strings/0x409
gadget_debug "add a msc function instance"
MSC_DIR=$GFUNC_PATH/mass_storage.usb0
mkdir -p $MSC_DIR
echo $DEVICE > $MSC_DIR/lun.0/file
echo 1 > $MSC_DIR/lun.0/removable
echo 0 > $MSC_DIR/lun.0/nofua
gadget_debug "add msc to usb config"
ln -s $MSC_DIR $GCONFIG/mass_storage.usb0
enable_udc
}
############################ MAIN #############################################
case "$1" in
stop)
stop
;;
start)
check $2
start $2
;;
*)
usage
;;
esac
exit $?

View file

@ -0,0 +1,176 @@
#!/bin/sh
# configfs for uas mass-storage usb gadget
# should enable in Kconfig: target core, target core > fileio, f_tcm
name=$(basename $0)
VENDOR_ID="0x361C"
PRODUC_ID="0x001f"
SERNUM_STR="20211102"
MANUAF_STR="Spacemit"
PRODUC_STR="K1 Mass Storage(UASP)"
# SCSI naa
NAA="naa.6001405c3214b06a"
CONFIGFS=/sys/kernel/config
CORE_DIR=$CONFIGFS/target/core
USB_GDIR=$CONFIGFS/target/usb_gadget
GADGET_PATH=$CONFIGFS/usb_gadget/tcm
die()
{
echo $1
exit 1
}
usage()
{
echo "$name Usage: "
echo ""
echo "$name start [device]: start tcm usb_gadget"
echo -e "\t\tdevice: block dev to use iblock, file to use fileio, \`rd\` to use rd_mcp"
echo -e "\t\tstop: stop tcm usb_gadget"
echo -e "\texample: $name /dev/mmcblk1p1"
echo ""
}
########################### Gadget ####################################tcm#######
enable_udc()
{
# Ensure fu->tpg = tpg_instances[i].tpg won't get NULL
ln -s $GADGET_PATH/functions/tcm.0 $GADGET_PATH/configs/c.1/
# If only one usb controller:
echo c0900100.udc > $GADGET_PATH/UDC
}
config_gadget()
{
echo "gadget-setup: config $VENDOR_ID/$PRODUC_ID/$SERNUM_STR/$MANUAF_STR/$PRODUC_STR."
mkdir $GADGET_PATH
echo $VENDOR_ID > $GADGET_PATH/idVendor
echo $PRODUC_ID > $GADGET_PATH/idProduct
mkdir $GADGET_PATH/strings/0x409
echo $SERNUM_STR > $GADGET_PATH/strings/0x409/serialnumber
echo $MANUAF_STR > $GADGET_PATH/strings/0x409/manufacturer
echo $PRODUC_STR > $GADGET_PATH/strings/0x409/product
mkdir $GADGET_PATH/configs/c.1
echo 0xc0 > $GADGET_PATH/configs/c.1/bmAttributes
echo 2 > $GADGET_PATH/configs/c.1/MaxPower
mkdir $GADGET_PATH/configs/c.1/strings/0x409
mkdir -p $GADGET_PATH/functions/tcm.0
}
clean_gadget()
{
rmdir $GADGET_PATH/functions/tcm.0
# Remove strings:
rmdir $GADGET_PATH/configs/c.1/strings/0x409
rmdir $GADGET_PATH/strings/0x409
# Remove config:
rmdir $GADGET_PATH/configs/c.1
rmdir $GADGET_PATH
}
disable_udc()
{
echo > $GADGET_PATH/UDC
rm -f $GADGET_PATH/configs/c.1/tcm.0
}
############################### TCM related ##################################
config_target()
{
DEVICE=$1
# Create a backstore
if [ -z "$DEVICE" ]; then
# RD_MCP backend is only for DEBUG usage
echo "$name: no device specificed, select rd_mcp as backstore"
BACKSTORE_DIR=$CORE_DIR/rd_mcp_0/ramdisk
mkdir -p $BACKSTORE_DIR
# 128MB pure ramdisk
echo rd_pages=32768 > $BACKSTORE_DIR/control
elif [ -b $DEVICE ]; then
echo "$name: block device, select iblock as backstore"
BACKSTORE_DIR=$CORE_DIR/iblock_0/iblock
mkdir -p $BACKSTORE_DIR
echo "udev_path=${DEVICE}" > $BACKSTORE_DIR/control
else
echo "$name: other path, select fileio as backstore"
BACKSTORE_DIR=$CORE_DIR/fileio_0/fileio
mkdir -p $BACKSTORE_DIR
DEVICE_SIZE=$(du -b $DEVICE | cut -f1)
echo "fd_dev_name=${DEVICE},fd_dev_size=${DEVICE_SIZE}" > $BACKSTORE_DIR/control
# echo 1 > $BACKSTORE_DIR/attrib/emulate_write_cache
fi
[ -n "$DEVICE" ] && umount $DEVICE
echo 1 > $BACKSTORE_DIR/enable
echo "$name: NAA of target: $NAA"
# Create an NAA target and a target portal group (TPG)
mkdir -p $USB_GDIR/$NAA/tpgt_1/
echo "$name tpgt_1 has lun_0"
# Create a LUN
mkdir $USB_GDIR/$NAA/tpgt_1/lun/lun_0
# Nexus initiator on target port 1 to $NAA
echo $NAA > $USB_GDIR/$NAA/tpgt_1/nexus
# Allow write access for non authenticated initiators
# echo 0 > $USB_GDIR/$NAA/tpgt_1/attrib/demo_mode_write_protect
ln -s $BACKSTORE_DIR $USB_GDIR/$NAA/tpgt_1/lun/lun_0/data
#ln -s $BACKSTORE_DIR $USB_GDIR/$NAA/tpgt_1/lun/lun_0/virtual_scsi_port
# Enable the target portal group, with 1 lun
echo 1 > $USB_GDIR/$NAA/tpgt_1/enable
}
clean_target()
{
[ -d "$USB_GDIR/$NAA/tpgt_1/enable" ] && echo 0 > $USB_GDIR/$NAA/tpgt_1/enable
rm -f $USB_GDIR/$NAA/tpgt_1/lun/lun_0/data
rm -f $USB_GDIR/$NAA/tpgt_1/lun/lun_0/virtual_scsi_port
rmdir $USB_GDIR/$NAA/tpgt_1/lun/lun_0
rmdir $USB_GDIR/$NAA/tpgt_1/
rmdir $USB_GDIR/$NAA/
rmdir $USB_GDIR
BACKSTORE_DIR=$CORE_DIR/iblock_0/iblock
rmdir $BACKSTORE_DIR
BACKSTORE_DIR=$CORE_DIR/fileio_0/fileio
rmdir $BACKSTORE_DIR
BACKSTORE_DIR=$CORE_DIR/rd_mcp_0/ramdisk
rmdir $BACKSTORE_DIR
}
stop()
{
disable_udc
clean_target
clean_gadget
}
check()
{
DEVICE=$1
[ -n "$DEVICE" ] || die "No device specificed"
[ -b $DEVICE -o -f $DEVICE ] || die "Invalid device or file: ${DEVICE}"
}
start()
{
# Load the target modules and mount the config file system
# Uncomment these if modules not built-in:
# lsmod | grep -q configfs || modprobe configfs
# lsmod | grep -q target_core_mod || modprobe target_core_mod
DEVICE=$1
mount | grep configfs
[ $? -eq 0 ] || mount -t configfs none $CONFIGFS
mkdir -p $USB_GDIR
config_gadget
# Config target after gadget, or tpgt cannot be mkdired
config_target $DEVICE
enable_udc
}
############################ MAIN #############################################
case "$1" in
stop)
stop
;;
start)
case "$2" in
rd|ramdisk|rd_mcp)
start
;;
*)
check $2
start $2
;;
esac
;;
*)
usage
;;
esac
exit $?

View file

@ -0,0 +1,176 @@
#!/bin/sh
# configfs for uas mass-storage usb gadget
# should enable in Kconfig: target core, target core > fileio, f_tcm
name=$(basename $0)
VENDOR_ID="0x361C"
PRODUC_ID="0x001f"
SERNUM_STR="20211102"
MANUAF_STR="Spacemit"
PRODUC_STR="K1 Mass Storage(UASP)"
# SCSI naa
NAA="naa.6001405c3214b06a"
CONFIGFS=/sys/kernel/config
CORE_DIR=$CONFIGFS/target/core
USB_GDIR=$CONFIGFS/target/usb_gadget
GADGET_PATH=$CONFIGFS/usb_gadget/tcm
die()
{
echo $1
exit 1
}
usage()
{
echo "$name Usage: "
echo ""
echo "$name start [device]: start tcm usb_gadget"
echo -e "\t\tdevice: block dev to use iblock, file to use fileio, \`rd\` to use rd_mcp"
echo -e "\t\tstop: stop tcm usb_gadget"
echo -e "\texample: $name /dev/mmcblk1p1"
echo ""
}
########################### Gadget ####################################tcm#######
enable_udc()
{
# Ensure fu->tpg = tpg_instances[i].tpg won't get NULL
ln -s $GADGET_PATH/functions/tcm.0 $GADGET_PATH/configs/c.1/
# If only one usb controller:
echo c0a00000.dwc3 > $GADGET_PATH/UDC
}
config_gadget()
{
echo "gadget-setup: config $VENDOR_ID/$PRODUC_ID/$SERNUM_STR/$MANUAF_STR/$PRODUC_STR."
mkdir $GADGET_PATH
echo $VENDOR_ID > $GADGET_PATH/idVendor
echo $PRODUC_ID > $GADGET_PATH/idProduct
mkdir $GADGET_PATH/strings/0x409
echo $SERNUM_STR > $GADGET_PATH/strings/0x409/serialnumber
echo $MANUAF_STR > $GADGET_PATH/strings/0x409/manufacturer
echo $PRODUC_STR > $GADGET_PATH/strings/0x409/product
mkdir $GADGET_PATH/configs/c.1
echo 0xc0 > $GADGET_PATH/configs/c.1/bmAttributes
echo 2 > $GADGET_PATH/configs/c.1/MaxPower
mkdir $GADGET_PATH/configs/c.1/strings/0x409
mkdir -p $GADGET_PATH/functions/tcm.0
}
clean_gadget()
{
rmdir $GADGET_PATH/functions/tcm.0
# Remove strings:
rmdir $GADGET_PATH/configs/c.1/strings/0x409
rmdir $GADGET_PATH/strings/0x409
# Remove config:
rmdir $GADGET_PATH/configs/c.1
rmdir $GADGET_PATH
}
disable_udc()
{
echo > $GADGET_PATH/UDC
rm -f $GADGET_PATH/configs/c.1/tcm.0
}
############################### TCM related ##################################
config_target()
{
DEVICE=$1
# Create a backstore
if [ -z "$DEVICE" ]; then
# RD_MCP backend is only for DEBUG usage
echo "$name: no device specificed, select rd_mcp as backstore"
BACKSTORE_DIR=$CORE_DIR/rd_mcp_0/ramdisk
mkdir -p $BACKSTORE_DIR
# 128MB pure ramdisk
echo rd_pages=32768 > $BACKSTORE_DIR/control
elif [ -b $DEVICE ]; then
echo "$name: block device, select iblock as backstore"
BACKSTORE_DIR=$CORE_DIR/iblock_0/iblock
mkdir -p $BACKSTORE_DIR
echo "udev_path=${DEVICE}" > $BACKSTORE_DIR/control
else
echo "$name: other path, select fileio as backstore"
BACKSTORE_DIR=$CORE_DIR/fileio_0/fileio
mkdir -p $BACKSTORE_DIR
DEVICE_SIZE=$(du -b $DEVICE | cut -f1)
echo "fd_dev_name=${DEVICE},fd_dev_size=${DEVICE_SIZE}" > $BACKSTORE_DIR/control
# echo 1 > $BACKSTORE_DIR/attrib/emulate_write_cache
fi
[ -n "$DEVICE" ] && umount $DEVICE
echo 1 > $BACKSTORE_DIR/enable
echo "$name: NAA of target: $NAA"
# Create an NAA target and a target portal group (TPG)
mkdir -p $USB_GDIR/$NAA/tpgt_1/
echo "$name tpgt_1 has lun_0"
# Create a LUN
mkdir $USB_GDIR/$NAA/tpgt_1/lun/lun_0
# Nexus initiator on target port 1 to $NAA
echo $NAA > $USB_GDIR/$NAA/tpgt_1/nexus
# Allow write access for non authenticated initiators
# echo 0 > $USB_GDIR/$NAA/tpgt_1/attrib/demo_mode_write_protect
ln -s $BACKSTORE_DIR $USB_GDIR/$NAA/tpgt_1/lun/lun_0/data
#ln -s $BACKSTORE_DIR $USB_GDIR/$NAA/tpgt_1/lun/lun_0/virtual_scsi_port
# Enable the target portal group, with 1 lun
echo 1 > $USB_GDIR/$NAA/tpgt_1/enable
}
clean_target()
{
[ -d "$USB_GDIR/$NAA/tpgt_1/enable" ] && echo 0 > $USB_GDIR/$NAA/tpgt_1/enable
rm -f $USB_GDIR/$NAA/tpgt_1/lun/lun_0/data
rm -f $USB_GDIR/$NAA/tpgt_1/lun/lun_0/virtual_scsi_port
rmdir $USB_GDIR/$NAA/tpgt_1/lun/lun_0
rmdir $USB_GDIR/$NAA/tpgt_1/
rmdir $USB_GDIR/$NAA/
rmdir $USB_GDIR
BACKSTORE_DIR=$CORE_DIR/iblock_0/iblock
rmdir $BACKSTORE_DIR
BACKSTORE_DIR=$CORE_DIR/fileio_0/fileio
rmdir $BACKSTORE_DIR
BACKSTORE_DIR=$CORE_DIR/rd_mcp_0/ramdisk
rmdir $BACKSTORE_DIR
}
stop()
{
disable_udc
clean_target
clean_gadget
}
check()
{
DEVICE=$1
[ -n "$DEVICE" ] || die "No device specificed"
[ -b $DEVICE -o -f $DEVICE ] || die "Invalid device or file: ${DEVICE}"
}
start()
{
# Load the target modules and mount the config file system
# Uncomment these if modules not built-in:
# lsmod | grep -q configfs || modprobe configfs
# lsmod | grep -q target_core_mod || modprobe target_core_mod
DEVICE=$1
mount | grep configfs
[ $? -eq 0 ] || mount -t configfs none $CONFIGFS
mkdir -p $USB_GDIR
config_gadget
# Config target after gadget, or tpgt cannot be mkdired
config_target $DEVICE
enable_udc
}
############################ MAIN #############################################
case "$1" in
stop)
stop
;;
start)
case "$2" in
rd|ramdisk|rd_mcp)
start
;;
*)
check $2
start $2
;;
esac
;;
*)
usage
;;
esac
exit $?

View file

@ -0,0 +1,44 @@
#!/bin/sh /etc/rc.common
#must after boot
START=11
start(){
echo 79 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio79/direction
echo 1 > /sys/class/gpio/gpio79/value
uas-gadget3.sh start /dev/nvme0n1p1
sleep 2
state=$(cat /sys/class/udc/c0a00000.dwc3/state)
echo "u3 state $state"
[ $state = "configured" ] && {
echo "u3 mass storage connected" > /dev/ttyS0
exit 0
}
uas-gadget3.sh stop
uas-gadget2-bot.sh start /dev/nvme0n1p1
sleep 2
state=$(cat /sys/class/udc/c0900100.udc/state)
[ $state = "configured" ] && {
echo "u2 mass storage connected" > /dev/ttyS0
exit 0
}
uas-gadget2-bot.sh stop
sleep 1
echo 0 > /sys/class/gpio/gpio79/value
echo "host" > /sys/kernel/debug/usb/c0a00000.dwc3/mode
echo "try u3 and u2 mass storage fails, falling to netbox"
sleep 3
/etc/init.d/network restart
uci set firewall.@zone[1].input='ACCEPT'
/etc/init.d/firewall reload
/etc/init.d/fstab boot
}
stop(){
echo "mass storage is stop"
}
restart(){
echo "mass storage is restart"
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,12 @@
# SPDX-License-Identifier: GPL-2.0-only
#
# Copyright (C) 2024 Spacemit Ltd.
include $(TOPDIR)/rules.mk
ARCH:=riscv64
BOARDNAME:=Spacemit K1 NAS
CPU_TYPE:=riscv64
KERNELNAME:=Image dtbs
DEVICE_TYPE:=nas

View file

@ -0,0 +1,18 @@
# SPDX-License-Identifier: GPL-2.0-only
#
# Copyright (C) 2022 OpenWrt.org
#
. /lib/functions/uci-defaults.sh
board_config_update
case "$(board_name)" in
spacemit,k1-x)
ucidef_set_led_netdev "wan" "WAN" "green:d3" "eth0"
;;
esac
board_config_flush
exit 0

View file

@ -0,0 +1,20 @@
# SPDX-License-Identifier: GPL-2.0-only
#
# Copyright (C) 2022 OpenWrt.org
#
. /lib/functions/uci-defaults.sh
board_config_update
case "$(board_name)" in
spacemit,MUSE-Pi |\
spacemit,deb1)
ucidef_set_interface_lan 'eth0 wlan0'
[ -d /sys/class/net/eth1 ] && ucidef_set_interface_wan eth1
;;
esac
board_config_flush
exit 0

View file

@ -0,0 +1,14 @@
interface=wlan0
driver=nl80211
ctrl_interface=/var/run/hostapd
ssid=openWRT-AP
wpa_passphrase=12345678
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP TKIP
wpa_pairwise=TKIP CCMP
channel=6
ieee80211n=1
hw_mode=g
bridge=br-lan
ignore_broadcast_ssid=0

View file

@ -0,0 +1,6 @@
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
159.27.188.198 archive.spacemit.com

View file

@ -0,0 +1,13 @@
#!/bin/sh /etc/rc.common
#must after boot
START=99
start(){
hostapd -B /etc/hostapd.conf
}
stop(){
echo "hostapd needs to be stopped manually"
}
restart(){
echo "hostapd needs to be restart manually"
}

View file

@ -0,0 +1,4 @@
::sysinit:/etc/init.d/rcS S boot
::shutdown:/etc/init.d/rcS K shutdown
::askconsole:/usr/libexec/login.sh
ttyS0::askfirst:/usr/libexec/login.sh

View file

@ -0,0 +1,19 @@
# Copyright (C) 2012-2015 OpenWrt.org
move_config() {
local partdev
. /lib/upgrade/common.sh
if export_bootdevice && export_partdevice partdev 3; then
if mount -t vfat -o rw,noatime "/dev/$partdev" /mnt; then
if [ -f "/mnt/$BACKUP_FILE" ]; then
mv -f "/mnt/$BACKUP_FILE" /
fi
umount /mnt
fi
fi
}
boot_hook_add preinit_mount_root move_config

View file

@ -0,0 +1,86 @@
platform_check_image() {
local diskdev partdev diff
export_bootdevice && export_partdevice diskdev 0 || {
echo "Unable to determine upgrade device"
return 1
}
get_partitions "/dev/$diskdev" bootdisk
#extract the boot sector from the image
get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b 2>/dev/null
get_partitions /tmp/image.bs image
#compare tables
diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)"
rm -f /tmp/image.bs /tmp/partmap.bootdisk /tmp/partmap.image
if [ -n "$diff" ]; then
echo "Partition layout has changed. Full image will be written."
ask_bool 0 "Abort" && exit 1
return 0
fi
}
platform_copy_config() {
local partdev
if export_partdevice partdev 3; then
mount -t vfat -o rw,noatime "/dev/$partdev" /mnt
cp -af "$UPGRADE_BACKUP" "/mnt/$BACKUP_FILE"
umount /mnt
fi
}
platform_do_upgrade() {
local diskdev partdev diff
export_bootdevice && export_partdevice diskdev 0 || {
echo "Unable to determine upgrade device"
return 1
}
sync
if [ "$UPGRADE_OPT_SAVE_PARTITIONS" = "1" ]; then
get_partitions "/dev/$diskdev" bootdisk
#extract the boot sector from the image
get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b
get_partitions /tmp/image.bs image
#compare tables
diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)"
else
diff=1
fi
if [ -n "$diff" ]; then
get_image "$@" | dd of="/dev/$diskdev" bs=4096 conv=fsync
# Separate removal and addtion is necessary; otherwise, partition 1
# will be missing if it overlaps with the old partition 2
partx -d - "/dev/$diskdev"
partx -a - "/dev/$diskdev"
return 0
fi
#iterate over each partition from the image and write it to the boot disk
while read part start size; do
if export_partdevice partdev $part; then
echo "Writing image to /dev/$partdev..."
get_image "$@" | dd of="/dev/$partdev" ibs="512" obs=1M skip="$start" count="$size" conv=fsync
else
echo "Unable to find partition $part device, skipped."
fi
done < /tmp/partmap.image
#copy partition uuid
echo "Writing new UUID to /dev/$diskdev..."
get_image "$@" | dd of="/dev/$diskdev" bs=1 skip=440 count=4 seek=440 conv=fsync
}

View file

@ -0,0 +1,117 @@
#!/bin/sh
# configfs for bot mass-storage usb gadget
# should enable in Kconfig: target core, target core > fileio, f_msc
name=$(basename $0)
VENDOR_ID="0x361C"
PRODUC_ID="0x002f"
SERNUM_STR="20211102"
MANUAF_STR="Spacemit"
PRODUC_STR="K1 Mass Storage(BOT)"
# SCSI naa
CONFIGFS=/sys/kernel/config
GADGET_PATH=$CONFIGFS/usb_gadget/msc
GFUNC_PATH=$GADGET_PATH/functions
GCONFIG=$GADGET_PATH/configs/c.1
usage()
{
echo "$name Usage: "
echo ""
echo -e "\texample: $name start /dev/mmcblk1p1"
echo -e "\texample: $name stop"
echo ""
}
########################### Gadget ####################################msc#######
gadget_info()
{
echo "$name: $1"
}
gadget_debug()
{
[ $DEBUG ] && echo "$name: $1"
}
die()
{
gadget_info "$1"
exit 1
}
g_remove()
{
[ -h $1 ] && rm -f $1
[ -d $1 ] && rmdir $1
[ -e $1 ] && rm -f $1
}
enable_udc()
{
echo c0900100.udc > $GADGET_PATH/UDC
}
stop()
{
[ -e $GADGET_PATH/UDC ] || die "gadget not configured, no need to clean"
gadget_info "Echo none to udc"
[ -e $GADGET_PATH/UDC ] || die "gadget not configured yet"
[ `cat $GADGET_PATH/UDC` ] && echo "" > $GADGET_PATH/UDC
gadget_debug "clean msc"
gadget_debug "remove msc from usb config"
g_remove $GCONFIG/mass_storage.usb0
# Remove strings:
gadget_info "remove strings of c.1."
g_remove $GCONFIG/strings/0x409
# Remove config:
gadget_info "remove configs c.1."
g_remove $GCONFIG
g_remove $GFUNC_PATH/mass_storage.usb0
# Remove string in gadget
gadget_info "remove strings of $GADGET_PATH."
g_remove $GADGET_PATH/strings/0x409
# Remove gadget
gadget_info "remove $GADGET_PATH."
g_remove $GADGET_PATH
}
check()
{
DEVICE=$1
[ -n "$DEVICE" ] || die "No device specificed"
[ -b $DEVICE -o -f $DEVICE ] || die "Invalid device or file: ${DEVICE}"
}
start()
{
DEVICE=$1
gadget_info "config $VENDOR_ID/$PRODUC_ID/$SERNUM_STR/$MANUAF_STR/$PRODUC_STR."
mountpoint -q /sys/kernel/config || mount -t configfs none /sys/kernel/config
[ -e $GADGET_PATH ] && die "ERROR: gadget already configured, should run stop first"
mkdir $GADGET_PATH
echo $VENDOR_ID > $GADGET_PATH/idVendor
echo $PRODUC_ID > $GADGET_PATH/idProduct
mkdir $GADGET_PATH/strings/0x409
echo $SERNUM_STR > $GADGET_PATH/strings/0x409/serialnumber
echo $MANUAF_STR > $GADGET_PATH/strings/0x409/manufacturer
echo $PRODUC_STR > $GADGET_PATH/strings/0x409/product
mkdir $GCONFIG
echo 0xc0 > $GCONFIG/bmAttributes
echo 500 > $GCONFIG/MaxPower
mkdir $GCONFIG/strings/0x409
gadget_debug "add a msc function instance"
MSC_DIR=$GFUNC_PATH/mass_storage.usb0
mkdir -p $MSC_DIR
echo $DEVICE > $MSC_DIR/lun.0/file
echo 1 > $MSC_DIR/lun.0/removable
echo 0 > $MSC_DIR/lun.0/nofua
gadget_debug "add msc to usb config"
ln -s $MSC_DIR $GCONFIG/mass_storage.usb0
enable_udc
}
############################ MAIN #############################################
case "$1" in
stop)
stop
;;
start)
check $2
start $2
;;
*)
usage
;;
esac
exit $?

View file

@ -0,0 +1,176 @@
#!/bin/sh
# configfs for uas mass-storage usb gadget
# should enable in Kconfig: target core, target core > fileio, f_tcm
name=$(basename $0)
VENDOR_ID="0x361C"
PRODUC_ID="0x001f"
SERNUM_STR="20211102"
MANUAF_STR="Spacemit"
PRODUC_STR="K1 Mass Storage(UASP)"
# SCSI naa
NAA="naa.6001405c3214b06a"
CONFIGFS=/sys/kernel/config
CORE_DIR=$CONFIGFS/target/core
USB_GDIR=$CONFIGFS/target/usb_gadget
GADGET_PATH=$CONFIGFS/usb_gadget/tcm
die()
{
echo $1
exit 1
}
usage()
{
echo "$name Usage: "
echo ""
echo "$name start [device]: start tcm usb_gadget"
echo -e "\t\tdevice: block dev to use iblock, file to use fileio, \`rd\` to use rd_mcp"
echo -e "\t\tstop: stop tcm usb_gadget"
echo -e "\texample: $name /dev/mmcblk1p1"
echo ""
}
########################### Gadget ####################################tcm#######
enable_udc()
{
# Ensure fu->tpg = tpg_instances[i].tpg won't get NULL
ln -s $GADGET_PATH/functions/tcm.0 $GADGET_PATH/configs/c.1/
# If only one usb controller:
echo c0900100.udc > $GADGET_PATH/UDC
}
config_gadget()
{
echo "gadget-setup: config $VENDOR_ID/$PRODUC_ID/$SERNUM_STR/$MANUAF_STR/$PRODUC_STR."
mkdir $GADGET_PATH
echo $VENDOR_ID > $GADGET_PATH/idVendor
echo $PRODUC_ID > $GADGET_PATH/idProduct
mkdir $GADGET_PATH/strings/0x409
echo $SERNUM_STR > $GADGET_PATH/strings/0x409/serialnumber
echo $MANUAF_STR > $GADGET_PATH/strings/0x409/manufacturer
echo $PRODUC_STR > $GADGET_PATH/strings/0x409/product
mkdir $GADGET_PATH/configs/c.1
echo 0xc0 > $GADGET_PATH/configs/c.1/bmAttributes
echo 2 > $GADGET_PATH/configs/c.1/MaxPower
mkdir $GADGET_PATH/configs/c.1/strings/0x409
mkdir -p $GADGET_PATH/functions/tcm.0
}
clean_gadget()
{
rmdir $GADGET_PATH/functions/tcm.0
# Remove strings:
rmdir $GADGET_PATH/configs/c.1/strings/0x409
rmdir $GADGET_PATH/strings/0x409
# Remove config:
rmdir $GADGET_PATH/configs/c.1
rmdir $GADGET_PATH
}
disable_udc()
{
echo > $GADGET_PATH/UDC
rm -f $GADGET_PATH/configs/c.1/tcm.0
}
############################### TCM related ##################################
config_target()
{
DEVICE=$1
# Create a backstore
if [ -z "$DEVICE" ]; then
# RD_MCP backend is only for DEBUG usage
echo "$name: no device specificed, select rd_mcp as backstore"
BACKSTORE_DIR=$CORE_DIR/rd_mcp_0/ramdisk
mkdir -p $BACKSTORE_DIR
# 128MB pure ramdisk
echo rd_pages=32768 > $BACKSTORE_DIR/control
elif [ -b $DEVICE ]; then
echo "$name: block device, select iblock as backstore"
BACKSTORE_DIR=$CORE_DIR/iblock_0/iblock
mkdir -p $BACKSTORE_DIR
echo "udev_path=${DEVICE}" > $BACKSTORE_DIR/control
else
echo "$name: other path, select fileio as backstore"
BACKSTORE_DIR=$CORE_DIR/fileio_0/fileio
mkdir -p $BACKSTORE_DIR
DEVICE_SIZE=$(du -b $DEVICE | cut -f1)
echo "fd_dev_name=${DEVICE},fd_dev_size=${DEVICE_SIZE}" > $BACKSTORE_DIR/control
# echo 1 > $BACKSTORE_DIR/attrib/emulate_write_cache
fi
[ -n "$DEVICE" ] && umount $DEVICE
echo 1 > $BACKSTORE_DIR/enable
echo "$name: NAA of target: $NAA"
# Create an NAA target and a target portal group (TPG)
mkdir -p $USB_GDIR/$NAA/tpgt_1/
echo "$name tpgt_1 has lun_0"
# Create a LUN
mkdir $USB_GDIR/$NAA/tpgt_1/lun/lun_0
# Nexus initiator on target port 1 to $NAA
echo $NAA > $USB_GDIR/$NAA/tpgt_1/nexus
# Allow write access for non authenticated initiators
# echo 0 > $USB_GDIR/$NAA/tpgt_1/attrib/demo_mode_write_protect
ln -s $BACKSTORE_DIR $USB_GDIR/$NAA/tpgt_1/lun/lun_0/data
#ln -s $BACKSTORE_DIR $USB_GDIR/$NAA/tpgt_1/lun/lun_0/virtual_scsi_port
# Enable the target portal group, with 1 lun
echo 1 > $USB_GDIR/$NAA/tpgt_1/enable
}
clean_target()
{
[ -d "$USB_GDIR/$NAA/tpgt_1/enable" ] && echo 0 > $USB_GDIR/$NAA/tpgt_1/enable
rm -f $USB_GDIR/$NAA/tpgt_1/lun/lun_0/data
rm -f $USB_GDIR/$NAA/tpgt_1/lun/lun_0/virtual_scsi_port
rmdir $USB_GDIR/$NAA/tpgt_1/lun/lun_0
rmdir $USB_GDIR/$NAA/tpgt_1/
rmdir $USB_GDIR/$NAA/
rmdir $USB_GDIR
BACKSTORE_DIR=$CORE_DIR/iblock_0/iblock
rmdir $BACKSTORE_DIR
BACKSTORE_DIR=$CORE_DIR/fileio_0/fileio
rmdir $BACKSTORE_DIR
BACKSTORE_DIR=$CORE_DIR/rd_mcp_0/ramdisk
rmdir $BACKSTORE_DIR
}
stop()
{
disable_udc
clean_target
clean_gadget
}
check()
{
DEVICE=$1
[ -n "$DEVICE" ] || die "No device specificed"
[ -b $DEVICE -o -f $DEVICE ] || die "Invalid device or file: ${DEVICE}"
}
start()
{
# Load the target modules and mount the config file system
# Uncomment these if modules not built-in:
# lsmod | grep -q configfs || modprobe configfs
# lsmod | grep -q target_core_mod || modprobe target_core_mod
DEVICE=$1
mount | grep configfs
[ $? -eq 0 ] || mount -t configfs none $CONFIGFS
mkdir -p $USB_GDIR
config_gadget
# Config target after gadget, or tpgt cannot be mkdired
config_target $DEVICE
enable_udc
}
############################ MAIN #############################################
case "$1" in
stop)
stop
;;
start)
case "$2" in
rd|ramdisk|rd_mcp)
start
;;
*)
check $2
start $2
;;
esac
;;
*)
usage
;;
esac
exit $?

View file

@ -0,0 +1,176 @@
#!/bin/sh
# configfs for uas mass-storage usb gadget
# should enable in Kconfig: target core, target core > fileio, f_tcm
name=$(basename $0)
VENDOR_ID="0x361C"
PRODUC_ID="0x001f"
SERNUM_STR="20211102"
MANUAF_STR="Spacemit"
PRODUC_STR="K1 Mass Storage(UASP)"
# SCSI naa
NAA="naa.6001405c3214b06a"
CONFIGFS=/sys/kernel/config
CORE_DIR=$CONFIGFS/target/core
USB_GDIR=$CONFIGFS/target/usb_gadget
GADGET_PATH=$CONFIGFS/usb_gadget/tcm
die()
{
echo $1
exit 1
}
usage()
{
echo "$name Usage: "
echo ""
echo "$name start [device]: start tcm usb_gadget"
echo -e "\t\tdevice: block dev to use iblock, file to use fileio, \`rd\` to use rd_mcp"
echo -e "\t\tstop: stop tcm usb_gadget"
echo -e "\texample: $name /dev/mmcblk1p1"
echo ""
}
########################### Gadget ####################################tcm#######
enable_udc()
{
# Ensure fu->tpg = tpg_instances[i].tpg won't get NULL
ln -s $GADGET_PATH/functions/tcm.0 $GADGET_PATH/configs/c.1/
# If only one usb controller:
echo c0a00000.dwc3 > $GADGET_PATH/UDC
}
config_gadget()
{
echo "gadget-setup: config $VENDOR_ID/$PRODUC_ID/$SERNUM_STR/$MANUAF_STR/$PRODUC_STR."
mkdir $GADGET_PATH
echo $VENDOR_ID > $GADGET_PATH/idVendor
echo $PRODUC_ID > $GADGET_PATH/idProduct
mkdir $GADGET_PATH/strings/0x409
echo $SERNUM_STR > $GADGET_PATH/strings/0x409/serialnumber
echo $MANUAF_STR > $GADGET_PATH/strings/0x409/manufacturer
echo $PRODUC_STR > $GADGET_PATH/strings/0x409/product
mkdir $GADGET_PATH/configs/c.1
echo 0xc0 > $GADGET_PATH/configs/c.1/bmAttributes
echo 2 > $GADGET_PATH/configs/c.1/MaxPower
mkdir $GADGET_PATH/configs/c.1/strings/0x409
mkdir -p $GADGET_PATH/functions/tcm.0
}
clean_gadget()
{
rmdir $GADGET_PATH/functions/tcm.0
# Remove strings:
rmdir $GADGET_PATH/configs/c.1/strings/0x409
rmdir $GADGET_PATH/strings/0x409
# Remove config:
rmdir $GADGET_PATH/configs/c.1
rmdir $GADGET_PATH
}
disable_udc()
{
echo > $GADGET_PATH/UDC
rm -f $GADGET_PATH/configs/c.1/tcm.0
}
############################### TCM related ##################################
config_target()
{
DEVICE=$1
# Create a backstore
if [ -z "$DEVICE" ]; then
# RD_MCP backend is only for DEBUG usage
echo "$name: no device specificed, select rd_mcp as backstore"
BACKSTORE_DIR=$CORE_DIR/rd_mcp_0/ramdisk
mkdir -p $BACKSTORE_DIR
# 128MB pure ramdisk
echo rd_pages=32768 > $BACKSTORE_DIR/control
elif [ -b $DEVICE ]; then
echo "$name: block device, select iblock as backstore"
BACKSTORE_DIR=$CORE_DIR/iblock_0/iblock
mkdir -p $BACKSTORE_DIR
echo "udev_path=${DEVICE}" > $BACKSTORE_DIR/control
else
echo "$name: other path, select fileio as backstore"
BACKSTORE_DIR=$CORE_DIR/fileio_0/fileio
mkdir -p $BACKSTORE_DIR
DEVICE_SIZE=$(du -b $DEVICE | cut -f1)
echo "fd_dev_name=${DEVICE},fd_dev_size=${DEVICE_SIZE}" > $BACKSTORE_DIR/control
# echo 1 > $BACKSTORE_DIR/attrib/emulate_write_cache
fi
[ -n "$DEVICE" ] && umount $DEVICE
echo 1 > $BACKSTORE_DIR/enable
echo "$name: NAA of target: $NAA"
# Create an NAA target and a target portal group (TPG)
mkdir -p $USB_GDIR/$NAA/tpgt_1/
echo "$name tpgt_1 has lun_0"
# Create a LUN
mkdir $USB_GDIR/$NAA/tpgt_1/lun/lun_0
# Nexus initiator on target port 1 to $NAA
echo $NAA > $USB_GDIR/$NAA/tpgt_1/nexus
# Allow write access for non authenticated initiators
# echo 0 > $USB_GDIR/$NAA/tpgt_1/attrib/demo_mode_write_protect
ln -s $BACKSTORE_DIR $USB_GDIR/$NAA/tpgt_1/lun/lun_0/data
#ln -s $BACKSTORE_DIR $USB_GDIR/$NAA/tpgt_1/lun/lun_0/virtual_scsi_port
# Enable the target portal group, with 1 lun
echo 1 > $USB_GDIR/$NAA/tpgt_1/enable
}
clean_target()
{
[ -d "$USB_GDIR/$NAA/tpgt_1/enable" ] && echo 0 > $USB_GDIR/$NAA/tpgt_1/enable
rm -f $USB_GDIR/$NAA/tpgt_1/lun/lun_0/data
rm -f $USB_GDIR/$NAA/tpgt_1/lun/lun_0/virtual_scsi_port
rmdir $USB_GDIR/$NAA/tpgt_1/lun/lun_0
rmdir $USB_GDIR/$NAA/tpgt_1/
rmdir $USB_GDIR/$NAA/
rmdir $USB_GDIR
BACKSTORE_DIR=$CORE_DIR/iblock_0/iblock
rmdir $BACKSTORE_DIR
BACKSTORE_DIR=$CORE_DIR/fileio_0/fileio
rmdir $BACKSTORE_DIR
BACKSTORE_DIR=$CORE_DIR/rd_mcp_0/ramdisk
rmdir $BACKSTORE_DIR
}
stop()
{
disable_udc
clean_target
clean_gadget
}
check()
{
DEVICE=$1
[ -n "$DEVICE" ] || die "No device specificed"
[ -b $DEVICE -o -f $DEVICE ] || die "Invalid device or file: ${DEVICE}"
}
start()
{
# Load the target modules and mount the config file system
# Uncomment these if modules not built-in:
# lsmod | grep -q configfs || modprobe configfs
# lsmod | grep -q target_core_mod || modprobe target_core_mod
DEVICE=$1
mount | grep configfs
[ $? -eq 0 ] || mount -t configfs none $CONFIGFS
mkdir -p $USB_GDIR
config_gadget
# Config target after gadget, or tpgt cannot be mkdired
config_target $DEVICE
enable_udc
}
############################ MAIN #############################################
case "$1" in
stop)
stop
;;
start)
case "$2" in
rd|ramdisk|rd_mcp)
start
;;
*)
check $2
start $2
;;
esac
;;
*)
usage
;;
esac
exit $?

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,12 @@
# SPDX-License-Identifier: GPL-2.0-only
#
# Copyright (C) 2024 Spacemit Ltd.
include $(TOPDIR)/rules.mk
ARCH:=riscv64
BOARDNAME:=Spacemit K1 SBC
CPU_TYPE:=riscv64
KERNELNAME:=Image dtbs
DEVICE_TYPE:=router

View file

@ -0,0 +1,16 @@
define KernelPackage/rtl8852bs
TITLE:=rtl8852bs sdio wifi driver
KCONFIG:=CONFIG_RTL8852BS
SUBMENU:=Wireless Drivers
DEPENDS+=
FILES:=$(LINUX_DIR)/drivers/net/wireless/realtek/rtl8852bs/8852bs.ko
AUTOLOAD:=$(call AutoLoad,99,8852bs)
endef
define KernelPackage/rtl8852bs/description
Kernel modules for rtl8852bs sdio wifi
endef
$(eval $(call KernelPackage,rtl8852bs))

View file

@ -0,0 +1,12 @@
# SPDX-License-Identifier: GPL-2.0-only
define Profile/Default
NAME:=Default Profile
PRIORITY:=1
endef
define Profile/Default/Description
Default package set compatible with most boards.
endef
$(eval $(call Profile,Default))