27eae6597e
SoC: AR9330 (or AR9331 revision?) Ethernet x1, Wireless 2.4G, uSD card slot x1. USB Power, include Li-Po Battery. Flash 8MiB. (factory is dual image) 1. write image is use half 4MiB size from factory. write initramfs image to mtd6 and mtd7. 2. change next boot setting. next is mtd6 boot. echo -ne "\x01" | dd of=/dev/mtdblock8 conv=notrunc bs=1 count=1 seek=0 3. rewrite sysupgrade image. change next boot setting. next is mtd4. echo -ne "\x00" | dd of=/dev/mtdblock8 conv=notrunc bs=1 count=1 seek=0 OEM mtd. dev: size erasesize name mtd0: 00040000 00010000 "u-boot" mtd1: 00010000 00010000 "u-boot-env" mtd2: 00010000 00010000 "ART" mtd3: 00010000 00010000 "NVRAM" mtd4: 00140000 00010000 "uImage" mtd5: 00280000 00010000 "rootfs" mtd6: 00140000 00010000 "uImage2" mtd7: 00280000 00010000 "rootfs2" mtd8: 00010000 00010000 "CONF" Signed-off-by: YuheiOKAWA <tochiro.srchack@gmail.com>
198 lines
4.2 KiB
Bash
198 lines
4.2 KiB
Bash
#!/bin/sh
|
|
|
|
[ -e /lib/firmware/$FIRMWARE ] && exit 0
|
|
|
|
. /lib/functions.sh
|
|
. /lib/functions/system.sh
|
|
|
|
ath9k_eeprom_die() {
|
|
echo "ath9k eeprom: " "$*"
|
|
exit 1
|
|
}
|
|
|
|
ath9k_eeprom_extract() {
|
|
local part=$1
|
|
local offset=$2
|
|
local count=$3
|
|
local mtd
|
|
|
|
mtd=$(find_mtd_chardev $part)
|
|
[ -n "$mtd" ] || \
|
|
ath9k_eeprom_die "no mtd device found for partition $part"
|
|
|
|
dd if=$mtd of=/lib/firmware/$FIRMWARE bs=1 skip=$offset count=$count 2>/dev/null || \
|
|
ath9k_eeprom_die "failed to extract from $mtd"
|
|
}
|
|
|
|
ath9k_eeprom_extract_reverse() {
|
|
local part=$1
|
|
local offset=$2
|
|
local count=$3
|
|
local mtd
|
|
local reversed
|
|
local caldata
|
|
|
|
mtd=$(find_mtd_chardev "$part")
|
|
reversed=$(hexdump -v -s $offset -n $count -e '/1 "%02x "' $mtd)
|
|
|
|
for byte in $reversed; do
|
|
caldata="\x${byte}${caldata}"
|
|
done
|
|
|
|
printf "%b" "$caldata" > /lib/firmware/$FIRMWARE
|
|
}
|
|
|
|
xor() {
|
|
local val
|
|
local ret="0x$1"
|
|
local retlen=${#1}
|
|
|
|
shift
|
|
while [ -n "$1" ]; do
|
|
val="0x$1"
|
|
ret=$((ret ^ val))
|
|
shift
|
|
done
|
|
|
|
printf "%0${retlen}x" "$ret"
|
|
}
|
|
|
|
ath9k_patch_fw_mac() {
|
|
local mac=$1
|
|
local mac_offset=$2
|
|
local chksum_offset=$3
|
|
local xor_mac
|
|
local xor_fw_mac
|
|
local xor_fw_chksum
|
|
|
|
[ -z "$mac" -o -z "$mac_offset" ] && return
|
|
|
|
[ -n "$chksum_offset" ] && {
|
|
xor_mac=${mac//:/}
|
|
xor_mac="${xor_mac:0:4} ${xor_mac:4:4} ${xor_mac:8:4}"
|
|
|
|
xor_fw_mac=$(hexdump -v -n 6 -s $mac_offset -e '/1 "%02x"' /lib/firmware/$FIRMWARE)
|
|
xor_fw_mac="${xor_fw_mac:0:4} ${xor_fw_mac:4:4} ${xor_fw_mac:8:4}"
|
|
|
|
xor_fw_chksum=$(hexdump -v -n 2 -s $chksum_offset -e '/1 "%02x"' /lib/firmware/$FIRMWARE)
|
|
xor_fw_chksum=$(xor $xor_fw_chksum $xor_fw_mac $xor_mac)
|
|
|
|
printf "%b" "\x${xor_fw_chksum:0:2}\x${xor_fw_chksum:2:2}" | \
|
|
dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=$chksum_offset count=2
|
|
}
|
|
|
|
macaddr_2bin $mac | dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=$mac_offset count=6
|
|
}
|
|
|
|
ath9k_patch_fw_mac_crc() {
|
|
local mac=$1
|
|
local mac_offset=$2
|
|
local chksum_offset=$((mac_offset - 10))
|
|
|
|
ath9k_patch_fw_mac "${mac}" "${mac_offset}" "${chksum_offset}"
|
|
}
|
|
|
|
board=$(board_name)
|
|
|
|
case "$FIRMWARE" in
|
|
"ath9k-eeprom-ahb-18100000.wmac.bin")
|
|
case $board in
|
|
avm,fritz4020)
|
|
ath9k_eeprom_extract_reverse "urlader" 5441 1088
|
|
;;
|
|
iodata,wn-ac1167dgr|\
|
|
iodata,wn-ac1600dgr2)
|
|
ath9k_eeprom_extract "art" 4096 1088
|
|
ath9k_patch_fw_mac $(mtd_get_mac_ascii u-boot-env ethaddr) 2
|
|
;;
|
|
*)
|
|
ath9k_eeprom_die "board $board is not supported yet"
|
|
;;
|
|
esac
|
|
;;
|
|
"ath9k-eeprom-pci-0000:00:00.0.bin")
|
|
case $board in
|
|
avm,fritz300e)
|
|
ath9k_eeprom_extract_reverse "urloader" 5441 1088
|
|
;;
|
|
buffalo,whr-g301n|\
|
|
buffalo,wzr-hp-g302h-a1a0|\
|
|
tplink,tl-wr841-v5|\
|
|
tplink,tl-wr941-v4)
|
|
ath9k_eeprom_extract "art" 4096 3768
|
|
;;
|
|
buffalo,wzr-hp-g450h)
|
|
ath9k_eeprom_extract "ART" 4096 1088
|
|
;;
|
|
ocedo,raccoon|\
|
|
tplink,tl-wdr3600|\
|
|
tplink,tl-wdr4300|\
|
|
tplink,tl-wdr4900-v2)
|
|
ath9k_eeprom_extract "art" 20480 1088
|
|
;;
|
|
netgear,wnr612-v2|\
|
|
on,n150r|\
|
|
pcs,cap324|\
|
|
tplink,tl-mr3220-v1|\
|
|
tplink,tl-mr3420-v1|\
|
|
tplink,tl-wr2543-v1|\
|
|
tplink,tl-wr740n-v1|\
|
|
tplink,tl-wr740n-v3|\
|
|
tplink,tl-wr741-v1|\
|
|
tplink,tl-wr743nd-v1|\
|
|
tplink,tl-wr841-v7|\
|
|
ubnt,bullet-m|\
|
|
ubnt,nano-m|\
|
|
ubnt,rocket-m)
|
|
ath9k_eeprom_extract "art" 4096 4096
|
|
;;
|
|
pqi,air-pen)
|
|
ath9k_eeprom_extract "art" 4096 2002
|
|
;;
|
|
ubnt,unifi)
|
|
ath9k_eeprom_extract "art" 4096 2048
|
|
;;
|
|
wd,mynet-wifi-rangeextender)
|
|
ath9k_eeprom_extract "art" 4096 4096
|
|
ath9k_patch_fw_mac_crc $(nvram get wl0_hwaddr) "$mac" 2
|
|
;;
|
|
*)
|
|
ath9k_eeprom_die "board $board is not supported yet"
|
|
;;
|
|
esac
|
|
;;
|
|
"ath9k-eeprom-pci-0000:00:11.0.bin")
|
|
case $board in
|
|
buffalo,wzr-hp-ag300h|\
|
|
netgear,wndr3700|\
|
|
netgear,wndr3700v2|\
|
|
netgear,wndr3800)
|
|
ath9k_eeprom_extract "art" 4096 3768
|
|
;;
|
|
dlink,dir-825-b1)
|
|
ath9k_eeprom_extract "caldata" 4096 3768
|
|
ath9k_patch_fw_mac_crc $(mtd_get_mac_text "caldata" 65440) 524
|
|
;;
|
|
*)
|
|
ath9k_eeprom_die "board $board is not supported yet"
|
|
;;
|
|
esac
|
|
;;
|
|
"ath9k-eeprom-pci-0000:00:12.0.bin")
|
|
case $board in
|
|
buffalo,wzr-hp-ag300h|\
|
|
netgear,wndr3700|\
|
|
netgear,wndr3700v2|\
|
|
netgear,wndr3800)
|
|
ath9k_eeprom_extract "art" 20480 3768
|
|
;;
|
|
dlink,dir-825-b1)
|
|
ath9k_eeprom_extract "caldata" 20480 3768
|
|
ath9k_patch_fw_mac_crc $(macaddr_add $(mtd_get_mac_text "caldata" 65460) 1) 524
|
|
;;
|
|
*)
|
|
ath9k_eeprom_die "board $board is not supported yet"
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|