From mboxrd@z Thu Jan 1 00:00:00 1970 From: Heiko Schocher Date: Fri, 08 May 2015 14:02:29 +0200 Subject: [U-Boot] [PATCH] arm, imx6: add support for aristainetos2 board In-Reply-To: <554C9BAA.9090208@denx.de> References: <1428827097-1367-1-git-send-email-hs@denx.de> <554C9BAA.9090208@denx.de> Message-ID: <554CA5D5.30104@denx.de> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hello Stefano, added Anatolij to cc for the rotate logo question ... Am 08.05.2015 13:19, schrieb Stefano Babic: > Hi Heiko, > > On 12/04/2015 10:24, Heiko Schocher wrote: >> add support for imx6dl based aristainetos2 board >> >> U-Boot 2015.04-rc5-00066-g60f6ed4 (Apr 10 2015 - 08:46:27) >> >> CPU: Freescale i.MX6DL rev1.1 at 792 MHz >> Reset cause: WDOG >> Board: aristaitenos2 >> Watchdog enabled >> I2C: ready >> DRAM: 1 GiB >> NAND: 1024 MiB >> MMC: FSL_SDHC: 0 >> SF: Detected N25Q128A with page size 256 Bytes, erase size 64 KiB, total 16 MiB >> Display: lg4573 (480x800) >> In: serial >> Out: serial >> Err: serial >> Net: FEC [PRIME] >> Hit any key to stop autoboot: 0 >> => >> >> Signed-off-by: Heiko Schocher >> --- >> >> arch/arm/Kconfig | 5 + >> board/aristainetos2/Kconfig | 12 + >> board/aristainetos2/MAINTAINERS | 6 + >> board/aristainetos2/Makefile | 12 + >> board/aristainetos2/aristainetos2.c | 917 ++++++++++++++++++++++++++++++++++ >> board/aristainetos2/aristainetos2.cfg | 34 ++ >> board/aristainetos2/axi.cfg | 22 + >> board/aristainetos2/clocks.cfg | 24 + >> board/aristainetos2/ddr-setup.cfg | 59 +++ >> board/aristainetos2/nt5cc256m16cp.cfg | 60 +++ >> configs/aristainetos2_defconfig | 3 + >> include/configs/aristainetos2.h | 351 +++++++++++++ >> 12 files changed, 1505 insertions(+) >> create mode 100644 board/aristainetos2/Kconfig >> create mode 100644 board/aristainetos2/MAINTAINERS >> create mode 100644 board/aristainetos2/Makefile >> create mode 100644 board/aristainetos2/aristainetos2.c >> create mode 100644 board/aristainetos2/aristainetos2.cfg >> create mode 100644 board/aristainetos2/axi.cfg >> create mode 100644 board/aristainetos2/clocks.cfg >> create mode 100644 board/aristainetos2/ddr-setup.cfg >> create mode 100644 board/aristainetos2/nt5cc256m16cp.cfg >> create mode 100644 configs/aristainetos2_defconfig >> create mode 100644 include/configs/aristainetos2.h >> [...] >> diff --git a/board/aristainetos2/aristainetos2.c b/board/aristainetos2/aristainetos2.c >> new file mode 100644 >> index 0000000..98e1bc7 >> --- /dev/null >> +++ b/board/aristainetos2/aristainetos2.c >> @@ -0,0 +1,917 @@ [...] >> +struct i2c_pads_info i2c_pad_info4 = { >> + .scl = { >> + .i2c_mode = MX6_PAD_GPIO_7__I2C4_SCL | PC, >> + .gpio_mode = MX6_PAD_GPIO_7__GPIO1_IO07 | PC, >> + .gp = IMX_GPIO_NR(1, 7) >> + }, >> + .sda = { >> + .i2c_mode = MX6_PAD_GPIO_8__I2C4_SDA | PC, >> + .gpio_mode = MX6_PAD_GPIO_8__GPIO1_IO08 | PC, >> + .gp = IMX_GPIO_NR(1, 8) >> + } >> +}; >> + >> +static int lgdisplay; > > It looks like strange to pass a parameter via a global variable. No > other way ? Hmm.. yes, I can check the "panel" environmentvariable ... changed. >> + >> +int dram_init(void) >> +{ >> + gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE); >> + >> + return 0; >> +} [...] >> +int board_phy_config(struct phy_device *phydev) >> +{ >> +#if defined(CONFIG_PHY_MICREL_KSZ9031) > > Is there another possibly phy chip ? If not, can we get rid of the #ifdef ? No other phy ... removed. >> + /* control data pad skew - devaddr = 0x02, register = 0x04 */ >> + ksz9031_phy_extended_write(phydev, 0x02, >> + MII_KSZ9031_EXT_RGMII_CTRL_SIG_SKEW, >> + MII_KSZ9031_MOD_DATA_NO_POST_INC, 0x0000); >> + /* rx data pad skew - devaddr = 0x02, register = 0x05 */ >> + ksz9031_phy_extended_write(phydev, 0x02, >> + MII_KSZ9031_EXT_RGMII_RX_DATA_SKEW, >> + MII_KSZ9031_MOD_DATA_NO_POST_INC, 0x0000); >> + /* tx data pad skew - devaddr = 0x02, register = 0x06 */ >> + ksz9031_phy_extended_write(phydev, 0x02, >> + MII_KSZ9031_EXT_RGMII_TX_DATA_SKEW, >> + MII_KSZ9031_MOD_DATA_NO_POST_INC, 0x0000); >> + /* gtx and rx clock pad skew - devaddr = 0x02, register = 0x08 */ >> + ksz9031_phy_extended_write(phydev, 0x02, >> + MII_KSZ9031_EXT_RGMII_CLOCK_SKEW, >> + MII_KSZ9031_MOD_DATA_NO_POST_INC, 0x03FF); >> +#endif /* CONFIG_PHY_MICREL_KSZ9031 */ [...] >> +/* >> + * Rotate the BMP_LOGO (only) >> + * Will only work, if the logo is square, as >> + * BMP_LOGO_HEIGHT and BMP_LOGO_WIDTH are defines, not variables >> + */ >> +void rotate_logo(int rotations) >> +{ >> + unsigned char out_logo[BMP_LOGO_WIDTH * BMP_LOGO_HEIGHT]; >> + unsigned char *in_logo; >> + int i, j; >> + >> + if (BMP_LOGO_WIDTH != BMP_LOGO_HEIGHT) >> + return; >> + >> + in_logo = bmp_logo_bitmap; >> + >> + /* one 90 degree rotation */ >> + if (rotations == 1 || rotations == 2 || rotations == 3) >> + rotate_logo_one(out_logo, in_logo); >> + >> + /* second 90 degree rotation */ >> + if (rotations == 2 || rotations == 3) >> + rotate_logo_one(in_logo, out_logo); >> + >> + /* third 90 degree rotation */ >> + if (rotations == 3) >> + rotate_logo_one(out_logo, in_logo); >> + >> + /* copy result back to original array */ >> + if (rotations == 1 || rotations == 3) >> + for (i = 0; i < BMP_LOGO_WIDTH; i++) >> + for (j = 0; j < BMP_LOGO_HEIGHT; j++) >> + in_logo[i * BMP_LOGO_WIDTH + j] = >> + out_logo[i * BMP_LOGO_WIDTH + j]; >> +} >> +#endif > > Should we put this code in a more common location ? As candidate I see > common/lcd_console_rotation.c or drivers/video/cfb_console.c I am unsure, as the logo must be a square ... added Anatolij to Cc ... @Anatolij: What do you think, has such a function a chance (and if yes, where is the best place for it?) >> + >> +static void enable_display_power(void) >> +{ >> + imx_iomux_v3_setup_multiple_pads(backlight_pads, >> + ARRAY_SIZE(backlight_pads)); >> + >> + /* backlight enable */ >> + gpio_direction_output(IMX_GPIO_NR(6, 31), 1); >> + /* LCD power enable */ >> + gpio_direction_output(IMX_GPIO_NR(6, 15), 1); >> + >> + /* enable backlight PWM 1 */ >> + if (pwm_init(0, 0, 0)) >> + goto error; >> + /* duty cycle 500ns, period: 3000ns */ >> + if (pwm_config(0, 50000, 300000)) >> + goto error; >> + if (pwm_enable(0)) >> + goto error; >> + return; >> + >> +error: >> + puts("error init pwm for backlight\n"); >> + return; >> +} [...] >> +static void enable_spi(struct display_info_t const *dev) >> +{ > > Names are just a little confusing. There is a setup_spi and enable_spi, > and it takes a bit to understand that enable_spi is only for display. > You could rename enable_spi with a name related to video/display. enable_spi_display ? >> + struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR; >> + struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR; >> + int reg; >> + s32 timeout = 100000; >> + >> +#if defined(CONFIG_VIDEO_BMP_LOGO) >> + rotate_logo(3); /* portrait display in landscape mode */ >> +#endif >> + >> + lgdisplay = 1; >> + ipu_set_ldb_clock(28341000); > > Where is coming from this value ? Can you add a comment for it ? This is coming from the displays parameters, IIRC I got them from the customer ... I try to get this info and add some more info into a comment. >> + >> + reg = readl(&ccm->cs2cdr); >> + >> + /* select pll 5 clock */ >> + reg &= ~(MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK >> + | MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK); >> + writel(reg, &ccm->cs2cdr); >> + [...] >> +#endif /* __ARISTAINETOS2_CONFIG_H */ >> > > Best regards, > Stefano Babic Thanks for your review! bye, Heiko -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany