其實我是下載這包 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 是相反的..
沒有留言:
張貼留言