linuxbootopenwrtu-bootflash-memory

The beginning and end address of the Flash memory


I am trying to run Linux on an Arduino Yun board. The Arduino board contains an Atheros AR9331 chipset

On U-Boot these are the steps I am doing:

1- Download the kernel:

ar7240> tftp 0x80060000 openwrt-ar71xx-generic-uImage-lzma.bin;
Load address: 0x80060000
Loading: #################################################################
     #################################################################
     #################################################################
     #################################################################
     ######################
done
Bytes transferred = 1441863 (160047 hex)

2- Erase Flash in order to copy the kernel:

ar7240> erase 0x9fEa0000 +0x160047 
Error: end address (0xa0000046) not in flash!
Bad address format

This is the problem It seems that 0x9fEa0000 +0x160047 exceeds the total size of the flash.

So my questions are:

1- How can I figure the total amount of memory reserved for the flash in Uboot (From which address it starts and ends), I am thinking about changing 0x9fEa0000 by a fewer address but I'm afraid I can harm other things

This is the output of the help:

ar7240> help
?       - alias for 'help'
boot    - boot default, i.e., run 'bootcmd'
bootd   - boot default, i.e., run 'bootcmd'
bootm   - boot application image from memory
cp      - memory copy
erase   - erase FLASH memory
help    - print online help
md      - memory display
mm      - memory modify (auto-incrementing)
mtest   - simple RAM test
mw      - memory write (fill)
nm      - memory modify (constant address)
ping    - send ICMP ECHO_REQUEST to network host
printenv- print environment variables
progmac - Set ethernet MAC addresses
reset   - Perform RESET of the CPU
run     - run commands in an environment variable
setenv  - set environment variables
tftpboot- boot image via network using TFTP protocol
version - print monitor version

2- Is there someone experienced with Atheros AR9331 chipset who can help me find the Flash mapping (From where it starts and ends) from the datasheet


Solution

  • You can determine the flash layout from the kernel boot command line. Either run the printenv command in u-boot or boot into the existing kernel and look through the boot log. You need to find something like the following:

    (There are plenty of guides on the internet, I took this one from https://finninday.net/wiki/index.php/Arduino_yun, your board may or may not be the same).

    linino> printenv
    bootargs=console=ttyATH0,115200 board=linino-yun mem=64M rootfstype=squashfs,jffs2 noinitrd mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,14656k(rootfs),1280k(kernel),64k(nvram),64k(art),15936k@0x50000(firmware)
    bootcmd=bootm 0x9fea0000
    

    This means there are the following partitions:

    u-boot 0 to 256K (0x0 - 0x40000)
    u-boot-env 256k to 320k (0x40000 - 0x50000)
    rootfs (squashfs) 320k to 14976k (0x50000 - 0xea0000)
    kernel 14976k to 16256k (0xea0000 - 0xfe0000)
    nvram 16256k to 16320k (0xfe0000 - 0xff0000)
    art 16320k to 16384k (0xff0000 - 0x1000000)
    

    The rootfs partition is 14M, which is much larger than the rootfs image file (less than 8MB) so in theory you can move the kernel image at a lower address. For this you will need to modify the kernel boot line in the u-boot environment block (rootfs aand kernel partition sizes) and the bootcmd parameter so the u-boot know where the new kernel is located.

    Flash is mapped to 0x9f000000 so the value in the bootcmd should be 0x9f000000 + the offset of the kernel in bytes.

    What I am not sure about is if there is an overlay filesystem for any persistent changes to the flash. Can you boot into the existing system and post the output of df -h and cat /proc/mounts?