lede/scripts/sercomm-kernel.sh
csharper2005 7c0b920f18
ramips: Add support for Beeline SmartBox TURBO+ (#8161)
* ramips: add support for Beeline(Sercomm) U-Boot

- Add recipe for several Beeline/Sercomm devices (e.g., Beeline SmartBox
  GIGA, Beeline SmartBox Turbo+, Sercomm S3) that appends special header
  to a kernel.

- Add device variables KERNEL_LOADADDR, LZMA_TEXT_START. It's also
  necessary for the devices mentioned above.

Signed-off-by: Mikhail Zhilkin <csharper2005@gmail.com>
(cherry picked from commit 6240da24f4c1442b0f750f06be512f630b0bc6c8)
Signed-off-by: Mikhail Zhilkin <csharper2005@gmail.com>

* ramips: Add support for Beeline SmartBox TURBO+

This PR adds support for router Beeline Smart Box TURBO+.
OEM/ODM Serсomm. Almost identical to Serсomm S3.

Specification
-------------
SoC Type: MediaTek MT7621AT (880 MHz, 2 cores)
RAM (Nanya NT5CC64M16GP): 128 MiB
Flash (Macronix MX30LF1G18AC): 128 MiB
Wireless 2.4 GHz (MT7603EN): b/g/n, 2x2
Wireless 5 GHz (MT7615N): a/n/ac, 4x4
Ethernet: 5 ports - 5×GbE (WAN, LAN1-4)
USB ports: 1xUSB3.0
Buttons: 2 button (reset, wps)
LEDs: Red, Green, Blue
Zigbee (EFR32MG1B232GG): 3.0
Stock bootloader: U-Boot 1.1.3
Power: 12 VDC, 1.5 A

Installation
------------
Attach serial console, then boot the initramfs image via TFTP.
Once inside OpenWrt, run sysupgrade -n with the sysupgrade file.

Signed-off-by: Maximilian Weinmann <x1@disroot.org>
(cherry picked from commit d1f294521bd8bc462c76e09c57a5c8b0600170cd)
(factory recipe from a2cfe339995467308c9126c3d0f70d2a28aeb073)
(big NAND from e6e5837a625ba09e286a5bde05f2ce581cfbeab7)
(removed nvmem cells, fixed conflicts)
Signed-off-by: Mikhail Zhilkin <csharper2005@gmail.com>

* ramips: add Sercomm partition map parser

This adds an MTD partition parser for the Sercomm partition table that
is used in some Netgear routers.

This is essentially the same code as proposed in the pull request for
Netgear R6350 support by NOGUCHI Hiroshi <drvlabo@gmail.com>:
https://github.com/openwrt/openwrt/pull/1318

It was originally rejected as it did not seem to work correctly.
However, this was only due the NAND driver transparently shifting pages
to hide bad blocks, which was fixed in commit
527832e54bf3bc4d699a145ae66f34230246f0a9.

Signed-off-by: Jan Hoffmann <jan@3e8.eu>
[x1@disroot.org: correction from checkpatch.pl]
Signed-off-by: Maximilian Weinmann <x1@disroot.org>
(cherry picked from commit 65e772105f8d5e98a999b836fed794b7415f2741)
Signed-off-by: Mikhail Zhilkin <csharper2005@gmail.com>

* ramips: Improve Beeline Smartbox Turbo+ support in lede

Changed switch configuration and a few minor changes.

Signed-off-by: Mikhail Zhilkin <csharper2005@gmail.com>

Co-authored-by: Maximilian Weinmann <x1@disroot.org>
Co-authored-by: Jan Hoffmann <jan@3e8.eu>
2021-11-03 12:16:32 +08:00

123 lines
3.5 KiB
Bash
Executable File

#!/usr/bin/env bash
# SPDX-License-Identifier: GPL-2.0-or-later
#
# Copyright (c) 2021 Mikhail Zhilkin <csharper2005@gmail.com>
#
###
### sercomm-kernel.sh - calculates and appends a special kernel header.
### Intended for some Sercomm devices (e.g., Beeline
### SmartBox GIGA, Beeline SmartBox Turbo+, Sercomm
### S3).
#
# Credits to @kar200 for the header description. More details are here:
# https://forum.openwrt.org/t/add-support-for-sercomm-s3-on-stock-uboot
#
if [ $# -ne 3 ]; then
echo "SYNTAX: $0 <kernel> <kernel_offset> <rootfs_offset>"
exit 1
fi
FILE_TMP=$1.shdr
KERNEL_IMG=$1
KERNEL_OFFSET=$2
ROOTFS_OFFSET=$3
# Sercomm HDR (0x53657200), 0xffffffff for hdr crc32 calc
hdr_sign_offs=0x0
hdr_sign_val=0x53657200
# Absoulte lenght for Sercomm footer
hdr_footer_size_offs=0x4
hdr_footer_size_val=
# Header checksum. 0xffffffff for hdr crc32 calc
hdr_head_chksum_offs=0x8
hdr_head_chksum_val=
# Magic constant (0x2ffffff)
hdr_int04_offs=0xc
hdr_int04_val=0x2ffffff
# Kernel flash offset
hdr_kern_offs_offs=0x10
hdr_kern_offs_val=$KERNEL_OFFSET
# Kernel lenght
hdr_kern_len_offs=0x14
hdr_kern_len_val=
# Kernel checksum
hdr_kern_chksum_offs=0x18
hdr_kern_chksum_val=
# Magic constant (0x0)
hdr_int08_offs=0x1c
hdr_int08_val=0x0
# Rootfs flash offset
hdr_rootfs_offs_offs=0x28
hdr_rootfs_offs_val=$ROOTFS_OFFSET
# Rootfs flash lenght. We're checking only first 4 bytes
hdr_rootfs_len_offs=0x2c
hdr_rootfs_len_val=0x4
# Rootfs checksum. Checksum is a constant for UBI (first 4 bytes)
hdr_rootfs_chksum_offs=0x30
hdr_rootfs_chksum_val=0x1cfc552d
# Magic constant (0x0)
hdr_int10_offs=0x34
hdr_int10_val=0x0
pad_zeros () {
awk '{ printf "%8s\n", $0 }' | sed 's/ /0/g'
}
# Remove leading 0x
trim_hx () {
printf "%x\n" $1 | pad_zeros
}
# Change endian
swap_hx () {
pad_zeros | awk '{for (i=7;i>=1;i=i-2) printf "%s%s", \
substr($1,i,2), (i>1?"":"\n")}'
}
# Check file size
fsize () {
printf "%x\n" `stat -c "%s" $1`
}
# Calculate checksum
chksum () {
dd if=$1 2>/dev/null | gzip -c | tail -c 8 | od -An -tx4 -N4 \
--endian=big | tr -d ' \n' | pad_zeros
}
# Write 4 bytes in the header by offset
write_hdr () {
echo -ne "$(echo $1 | sed 's/../\\x&/g')" | dd of=$FILE_TMP bs=1 \
seek=$(($2)) count=4 conv=notrunc status=none 2>/dev/null
}
# Pad a new header with 0xff
dd if=/dev/zero ibs=1 count=256 status=none | tr "\000" "\377" > \
$FILE_TMP 2>/dev/null
# Write constants
write_hdr $(trim_hx $hdr_int04_val) $hdr_int04_offs
write_hdr $(trim_hx $hdr_int08_val) $hdr_int08_offs
write_hdr $(trim_hx $hdr_int10_val) $hdr_int10_offs
# Write footer data
hdr_footer_size_val=$(($hdr_rootfs_offs_val + $hdr_rootfs_len_val))
write_hdr $(trim_hx $hdr_footer_size_val | swap_hx) $hdr_footer_size_offs
# Write kernel data
write_hdr $(trim_hx $hdr_kern_offs_val | swap_hx) $hdr_kern_offs_offs
hdr_kern_len_val=$(fsize $KERNEL_IMG | pad_zeros)
write_hdr $(echo $hdr_kern_len_val | swap_hx) $hdr_kern_len_offs
hdr_kern_chksum_val=$(chksum $KERNEL_IMG)
write_hdr $hdr_kern_chksum_val $hdr_kern_chksum_offs
# Write rootfs data
write_hdr $(trim_hx $hdr_rootfs_offs_val | swap_hx) $hdr_rootfs_offs_offs
write_hdr $(trim_hx $hdr_rootfs_len_val | swap_hx) $hdr_rootfs_len_offs
write_hdr $(trim_hx $hdr_rootfs_chksum_val) $hdr_rootfs_chksum_offs
# Write header checksum
hdr_head_chksum_val=$(chksum $FILE_TMP)
write_hdr $hdr_head_chksum_val $hdr_head_chksum_offs
# Place Sercomm signature
write_hdr $(trim_hx $hdr_sign_val) $hdr_sign_offs
dd if=$KERNEL_IMG >> $FILE_TMP
mv $FILE_TMP $KERNEL_IMG