2013年4月8日 星期一

i.MX51 u-boot splash screen supported

其實我是下載這包 code 後才發現現在 u-boot (2013.04.rc2) 有支援 i.MX51, 53 的 splash screen (boot-screen), 而且也支援 console stdout 轉向.

http://www.eewiki.net/display/linuxonarm/i.MX51+EVK

附帶一提, USB EHCI 也支援了, 而且傳輸速度相當的快 (實測有 34MiB/s, 不知道是我眼花還是怎樣..)

只是目前有兩個東西還沒打通, 還在試. 一個是 SPI NOR flash, 一個是 NAND flash (有人有出 patch, 我有照著改, 但還是不會動).

擺在這筆記一下.

ps. 2013/04/10 在 denx u-boot 官方的 mxc-spi.c code 裡, 它操作 SS0/SS1 這些 chip-select 動作都是用 gpio_set_value 的方式達成. 這樣的做法有好有壞, 以下就以不更動 denx 的 driver code 前提下修改板子的定義 header ( include/configs/%board%.h )

我是修改自 vision2, 還有 mx51_efikamx 的設定而來.
-------------------------------------------------

/*
 * SPI Configs
 */
#define CONFIG_CMD_SPI
#define CONFIG_MXC_SPI

#define CONFIG_FSL_SF
#define CONFIG_CMD_SF

#define CONFIG_SPI_FLASH
#define CONFIG_SPI_FLASH_ATMEL   //看需要更改.

/*
 * Use gpio 4 pin 25 as chip select for SPI flash
 * This corresponds to gpio 121
 */
#define CONFIG_SF_DEFAULT_CS     ( 1 | (121 << 8 ) )
#define CONFIG_SF_DEFAULT_MODE   (SPI_MODE_0)
#define CONFIG_SF_DEFAULT_SPEED  25000000

#define CONFIG_ENV_SPI_CS        ( 1 | (121 << 8 ) )
#define CONFIG_ENV_SPI_BUS       0
#define CONFIG_ENV_SPI_MAX_HZ    25000000
#define CONFIG_ENV_SPI_MODE      (SPI_MODE_0)

//384KiB
#define CONFIG_ENV_OFFSET       (6 * 64 * 1024)
#define CONFIG_ENV_SECT_SIZE    (1 * 64 * 1024)
#define CONFIG_ENV_SIZE         (4 * 1024)

//這邊的設定要注意擺在哪裡.
#define CONFIG_FSL_ENV_IN_SF
#define CONFIG_ENV_IS_IN_SPI_FLASH

// 這個定義建議一起改掉.
#define CONFIG_FSL_PMIC_CS      ( 0 | (120 << 8 ) )
-------------------------------------------------

以上還不是最主要的, 最主要的在 board init 的 code 裡. 以下翻改自 mx51evk.c, 紅色是刪除, 藍色是新增:
-------------------------------------------------

#ifdef CONFIG_MXC_SPI
static void setup_iomux_spi(void)
{
        /* 000: Select mux mode: ALT0 mux port: MOSI of instance: ecspi1 */
        mxc_request_iomux(MX51_PIN_CSPI1_MOSI, IOMUX_CONFIG_ALT0);
        mxc_iomux_set_pad(MX51_PIN_CSPI1_MOSI, 0x105);

        /* 000: Select mux mode: ALT0 mux port: MISO of instance: ecspi1. */
        mxc_request_iomux(MX51_PIN_CSPI1_MISO, IOMUX_CONFIG_ALT0);
        mxc_iomux_set_pad(MX51_PIN_CSPI1_MISO, 0x105);

        /* de-select SS1 of instance: ecspi1. */
        mxc_request_iomux(MX51_PIN_CSPI1_SS1, IOMUX_CONFIG_ALT3);
        mxc_iomux_set_pad(MX51_PIN_CSPI1_SS1, 0x85);

        /* 000: Select mux mode: ALT0 mux port: SS0 ecspi1 */
        //mxc_request_iomux(MX51_PIN_CSPI1_SS0, IOMUX_CONFIG_ALT0);
        //mxc_iomux_set_pad(MX51_PIN_CSPI1_SS0, 0x185);
        mxc_request_iomux(MX51_PIN_CSPI1_SS0, IOMUX_CONFIG_ALT3);
        mxc_iomux_set_pad(MX51_PIN_CSPI1_SS0, 0x85);

        /* 000: Select mux mode: ALT0 mux port: RDY of instance: ecspi1. */
        mxc_request_iomux(MX51_PIN_CSPI1_RDY, IOMUX_CONFIG_ALT0);
        mxc_iomux_set_pad(MX51_PIN_CSPI1_RDY, 0x180);

        /* 000: Select mux mode: ALT0 mux port: SCLK of instance: ecspi1. */
        mxc_request_iomux(MX51_PIN_CSPI1_SCLK, IOMUX_CONFIG_ALT0);
        mxc_iomux_set_pad(MX51_PIN_CSPI1_SCLK, 0x105);
        
        gpio_direction_output(IMX_GPIO_NR(4, 24), 0);   //SS0 active
        gpio_direction_output(IMX_GPIO_NR(4, 25), 1);   //SS1 active
        // IMX_GPIO_NR(4, 24) 可以用 120 取代, IMX_GPIO_NR(4, 25) 可以用 121 取代.
}
#endif

-------------------------------------------------

前面提到 SPI 的 chip-select 是用 GPIO 的方式操作, 所以
1. 只要找好 GPIO 編號拉好線, 理論上就可以再擴充 SPI NOR flash.
2. 操作是單一 pin 單一 chip-select 沒有二進位編碼, 需要更複雜的編碼制可能要自行修改 mxc_spi.c

後記 2013/04/14
SPI ROM 開機有幾點要注意:

1. ROM imae 起始點在 0x400
2. 起始點 0 ~ 0x3FF 這 1024 個 byte 最好全 erase 掉, 否則怪怪的.


後記 2013/09/01:

1. 有的 SPI 會這樣設:
#define CONFIG_SF_DEFAULT_MODE   (SPI_MODE_0 | SPI_CS_HIGH)
SPI_CS_HIGH 的用意是這個裝置 CS 為 high-active, 所以如果是 low-active 的, 千萬不要設...

2. SS0 跟 SS1 一開始不但要改成 GPIO, 還要注意這兩個分別是 hi 還 lo active, 記得預設要讓 bus 空著.


3. 這個設定在 SPI bus 同時有一個裝置以上時, 一定要設定:
#define CONFIG_FSL_PMIC_CS              (0 | 120 << 8) 
否則 gpio_set_value 會無法設定到正確的 GPIO pin.

前面文章是參考 mx51_efikamx 的設定, 卻沒有注意到 SST 跟 ATMEL 的 CS 是相反的..

沒有留言: