ar71xx: add support for PQI Air Pen
[openwrt/staging/wigyori.git] / target / linux / ar71xx / base-files / lib / upgrade / platform.sh
index 46f014306fc03234289e5840407469f038ffd90d..9cf20499e33a48d183859be8efff8e0138b3db7d 100755 (executable)
@@ -7,10 +7,13 @@
 
 PART_NAME=firmware
 RAMFS_COPY_DATA=/lib/ar71xx.sh
+[ -x /usr/sbin/nandwrite ] && RAMFS_COPY_BIN=/usr/sbin/nandwrite
 
 CI_BLKSZ=65536
 CI_LDADR=0x80060000
 
+PLATFORM_DO_UPGRADE_COMBINED_SEPARATE_MTD=0
+
 platform_find_partitions() {
        local first dev size erasesize name
        while read dev size erasesize name; do
@@ -40,6 +43,13 @@ platform_find_kernelpart() {
        done
 }
 
+platform_find_rootfspart() {
+       local part
+       for part in "${1%:*}" "${1#*:}"; do
+               [ "$part" != "$2" ] && echo "$part"; break
+       done
+}
+
 platform_do_upgrade_combined() {
        local partitions=$(platform_find_partitions)
        local kernelpart=$(platform_find_kernelpart "${partitions#*:}")
@@ -53,13 +63,22 @@ platform_do_upgrade_combined() {
           [ ${root_blocks:-0} -gt 0 ] && \
           [ ${erase_size:-0} -gt 0 ];
        then
+               local rootfspart=$(platform_find_rootfspart "$partitions" "$kernelpart")
                local append=""
                [ -f "$CONF_TAR" -a "$SAVE_CONFIG" -eq 1 ] && append="-j $CONF_TAR"
 
-               ( dd if="$1" bs=$CI_BLKSZ skip=1 count=$kern_blocks 2>/dev/null; \
-                 dd if="$1" bs=$CI_BLKSZ skip=$((1+$kern_blocks)) count=$root_blocks 2>/dev/null ) | \
-                       mtd -r $append -F$kernelpart:$kern_length:$CI_LDADR,rootfs write - $partitions
+               if [ "$PLATFORM_DO_UPGRADE_COMBINED_SEPARATE_MTD" -ne 1 ]; then
+                   ( dd if="$1" bs=$CI_BLKSZ skip=1 count=$kern_blocks 2>/dev/null; \
+                     dd if="$1" bs=$CI_BLKSZ skip=$((1+$kern_blocks)) count=$root_blocks 2>/dev/null ) | \
+                           mtd -r $append -F$kernelpart:$kern_length:$CI_LDADR,rootfs write - $partitions
+               elif [ -n "$rootfspart" ]; then
+                   dd if="$1" bs=$CI_BLKSZ skip=1 count=$kern_blocks 2>/dev/null | \
+                           mtd write - $kernelpart
+                   dd if="$1" bs=$CI_BLKSZ skip=$((1+$kern_blocks)) count=$root_blocks 2>/dev/null | \
+                           mtd -r $append write - $rootfspart
+               fi
        fi
+       PLATFORM_DO_UPGRADE_COMBINED_SEPARATE_MTD=0
 }
 
 tplink_get_image_hwid() {
@@ -105,6 +124,10 @@ seama_get_type_magic() {
        get_image "$@" | dd bs=1 count=4 skip=53 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"'
 }
 
+wrgg_get_image_magic() {
+       get_image "$@" | dd bs=4 count=1 skip=8 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"'
+}
+
 cybertan_get_image_magic() {
        get_image "$@" | dd bs=8 count=1 skip=0  2>/dev/null | hexdump -v -n 8 -e '1/1 "%02x"'
 }
@@ -160,6 +183,15 @@ alfa_check_image() {
        return 0
 }
 
+platform_nand_board_name() {
+       local board=$(ar71xx_board_name)
+
+       case "$board" in
+       rb*) echo "routerboard";;
+       *) echo "$board";;
+       esac
+}
+
 platform_check_image() {
        local board=$(ar71xx_board_name)
        local magic="$(get_magic_word "$1")"
@@ -172,12 +204,18 @@ platform_check_image() {
        airgateway|\
        airrouter|\
        ap132|\
-       ap81|\
-       ap83|\
+       ap90q|\
        bullet-m|\
        c-55|\
        carambola2|\
        cf-e316n-v2|\
+       cf-e320n-v2|\
+       cf-e380ac-v1|\
+       cf-e380ac-v2|\
+       cf-e520n|\
+       cf-e530n|\
+       cpe830|\
+       cpe870|\
        dgl-5500-a1|\
        dhp-1565-a1|\
        dir-505-a1|\
@@ -212,10 +250,15 @@ platform_check_image() {
        nanostation-m-xw|\
        nanostation-m|\
        nbg460n_550n_550nh|\
+       pqi-air-pen|\
        rocket-m-ti|\
        rocket-m-xw|\
        rocket-m|\
        rw2458n|\
+       sc1750|\
+       sc300m|\
+       sc450|\
+       sr3200|\
        tew-632brp|\
        tew-712br|\
        tew-732br|\
@@ -239,7 +282,8 @@ platform_check_image() {
        wzr-hp-ag300h|\
        wzr-hp-g300nh2|\
        wzr-hp-g300nh|\
-       wzr-hp-g450h)
+       wzr-hp-g450h|\
+       xd3200)
                [ "$magic" != "2705" ] && {
                        echo "Invalid image type."
                        return 1
@@ -249,7 +293,6 @@ platform_check_image() {
                ;;
        alfa-ap96|\
        alfa-nx|\
-       ap113|\
        ap121-mini|\
        ap121|\
        ap135-020|\
@@ -259,6 +302,7 @@ platform_check_image() {
        ap152|\
        ap96|\
        arduino-yun|\
+       bhr-4grv2|\
        bxu2000n-2-a1|\
        db120|\
        dr344|\
@@ -296,6 +340,7 @@ platform_check_image() {
        ls-sr71|\
        pb42|\
        pb44|\
+       rb-941-2nd|\
        routerstation-pro|\
        routerstation|\
        wp543|\
@@ -331,6 +376,7 @@ platform_check_image() {
        omy-x1|\
        onion-omega|\
        oolite|\
+       re450|\
        smart-300|\
        som9331|\
        tellstick-znet-lite|\
@@ -350,6 +396,7 @@ platform_check_image() {
        tl-wa750re|\
        tl-wa7510n|\
        tl-wa801nd-v2|\
+       tl-wa801nd-v3|\
        tl-wa830re-v2|\
        tl-wa850re|\
        tl-wa860re|\
@@ -362,8 +409,10 @@ platform_check_image() {
        tl-wdr4300|\
        tl-wdr4900-v2|\
        tl-wdr6500-v2|\
+       tl-wpa8630|\
        tl-wr1041n-v2|\
        tl-wr1043nd-v2|\
+       tl-wr1043nd-v4|\
        tl-wr1043nd|\
        tl-wr2543n|\
        tl-wr703n|\
@@ -382,6 +431,7 @@ platform_check_image() {
        tl-wr842n-v3|\
        tl-wr941nd-v5|\
        tl-wr941nd-v6|\
+       tl-wr940n-v4|\
        tl-wr941nd)
                local magic_ver="0100"
 
@@ -426,6 +476,10 @@ platform_check_image() {
        tew-673gru)
                dir825b_check_image "$1" && return 0
                ;;
+       rb*)
+               nand_do_platform_check routerboard $1
+               return $?
+               ;;
        c-60|\
        nbg6716|\
        r6100|\
@@ -436,7 +490,9 @@ platform_check_image() {
                ;;
        cpe210|\
        cpe510|\
-       eap120)
+       eap120|\
+       wbs210|\
+       wbs510)
                tplink_pharos_check_image "$1" && return 0
                return 1
                ;;
@@ -481,6 +537,7 @@ platform_check_image() {
 
                return 0
                ;;
+       e2100l|\
        mynet-rext|\
        wrt160nl)
                cybertan_check_image "$1" && return 0
@@ -531,6 +588,15 @@ platform_check_image() {
 
                return 0
                ;;
+       dap-2695-a1)
+               local magic=$(wrgg_get_image_magic "$1")
+               [ "$magic" != "21030820" ] && {
+                       echo "Invalid image, bad type: $magic"
+                       return 1
+               }
+
+               return 0;
+               ;;
        esac
 
        echo "Sysupgrade is not yet supported on $board."
@@ -541,6 +607,7 @@ platform_pre_upgrade() {
        local board=$(ar71xx_board_name)
 
        case "$board" in
+       rb*|\
        c-60|\
        nbg6716|\
        r6100|\
@@ -555,10 +622,29 @@ platform_pre_upgrade() {
        esac
 }
 
+platform_nand_pre_upgrade() {
+       local board=$(ar71xx_board_name)
+
+       case "$board" in
+       rb*)
+               CI_KERNPART=none
+               local fw_mtd=$(find_mtd_part kernel)
+               fw_mtd="${fw_mtd/block/}"
+               [ -n "$fw_mtd" ] || return
+               mtd erase kernel
+               tar xf "$1" sysupgrade-routerboard/kernel -O | nandwrite -o "$fw_mtd" -
+               ;;
+       esac
+}
+
 platform_do_upgrade() {
        local board=$(ar71xx_board_name)
 
        case "$board" in
+       rb-941-2nd)
+               PLATFORM_DO_UPGRADE_COMBINED_SEPARATE_MTD=1
+               platform_do_upgrade_combined "$ARGV"
+               ;;
        all0258n)
                platform_do_upgrade_allnet "0x9f050000" "$ARGV"
                ;;