[U-Boot] [PATCH v2 1/4] mx6cuboxi: Add HDMI output support
Vagrant Cascadian
vagrant at aikidev.net
Thu Apr 30 23:28:43 CEST 2015
On 2015-04-29, Fabio Estevam wrote:
> From: Fabio Estevam <fabio.estevam at freescale.com>
>
> Add HDMI output using PLL5 as the source for the IPU clocks,
> and accurate VESA timings.
>
> These settings are based on the patch from Soeren Moch <smoch at web.de>
> submitted for the tbs2910 mx6 based board.
>
> It allows the display to work properly at 1024x768 at 60.
>
> This should make the hdmi output signal compatible with most if not all
> modern displays.
>
> Signed-off-by: Jon Nettleton <jon.nettleton at gmail.com>
> Signed-off-by: Fabio Estevam <fabio.estevam at freescale.com>
> Reviewed-by: Tom Rini <trini at konsulko.com>
> Tested-by: Tom Rini <trini at konsulko.com>
Tested-by: Vagrant Cascadian <vagrant at aikidev.net>
> ---
> Changes since v1:
> - None
>
> board/solidrun/mx6cuboxi/mx6cuboxi.c | 101 ++++++++++++++++++++++++++++++++++-
> include/configs/mx6cuboxi.h | 18 ++++++-
> 2 files changed, 117 insertions(+), 2 deletions(-)
>
> diff --git a/board/solidrun/mx6cuboxi/mx6cuboxi.c b/board/solidrun/mx6cuboxi/mx6cuboxi.c
> index d3a32c1..eab92f1 100644
> --- a/board/solidrun/mx6cuboxi/mx6cuboxi.c
> +++ b/board/solidrun/mx6cuboxi/mx6cuboxi.c
> @@ -18,9 +18,11 @@
> #include <asm/arch/imx-regs.h>
> #include <asm/arch/iomux.h>
> #include <asm/arch/mx6-pins.h>
> +#include <asm/arch/mxc_hdmi.h>
> #include <asm/errno.h>
> #include <asm/gpio.h>
> #include <asm/imx-common/iomux-v3.h>
> +#include <asm/imx-common/video.h>
> #include <mmc.h>
> #include <fsl_esdhc.h>
> #include <miiphy.h>
> @@ -159,10 +161,107 @@ int board_eth_init(bd_t *bis)
> return cpu_eth_init(bis);
> }
>
> +#ifdef CONFIG_VIDEO_IPUV3
> +static void do_enable_hdmi(struct display_info_t const *dev)
> +{
> + imx_enable_hdmi_phy();
> +}
> +
> +struct display_info_t const displays[] = {
> + {
> + .bus = -1,
> + .addr = 0,
> + .pixfmt = IPU_PIX_FMT_RGB24,
> + .detect = detect_hdmi,
> + .enable = do_enable_hdmi,
> + .mode = {
> + .name = "HDMI",
> + /* 1024x768 at 60Hz (VESA)*/
> + .refresh = 60,
> + .xres = 1024,
> + .yres = 768,
> + .pixclock = 15384,
> + .left_margin = 160,
> + .right_margin = 24,
> + .upper_margin = 29,
> + .lower_margin = 3,
> + .hsync_len = 136,
> + .vsync_len = 6,
> + .sync = FB_SYNC_EXT,
> + .vmode = FB_VMODE_NONINTERLACED
> + }
> + }
> +};
> +
> +size_t display_count = ARRAY_SIZE(displays);
> +
> +static int setup_display(void)
> +{
> + struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
> + int reg;
> + int timeout = 100000;
> +
> + enable_ipu_clock();
> + imx_setup_hdmi();
> +
> + /* set video pll to 455MHz (24MHz * (37+11/12) / 2) */
> + setbits_le32(&ccm->analog_pll_video, BM_ANADIG_PLL_VIDEO_POWERDOWN);
> +
> + reg = readl(&ccm->analog_pll_video);
> + reg &= ~BM_ANADIG_PLL_VIDEO_DIV_SELECT;
> + reg |= BF_ANADIG_PLL_VIDEO_DIV_SELECT(37);
> + reg &= ~BM_ANADIG_PLL_VIDEO_POST_DIV_SELECT;
> + reg |= BF_ANADIG_PLL_VIDEO_POST_DIV_SELECT(1);
> + writel(reg, &ccm->analog_pll_video);
> +
> + writel(BF_ANADIG_PLL_VIDEO_NUM_A(11), &ccm->analog_pll_video_num);
> + writel(BF_ANADIG_PLL_VIDEO_DENOM_B(12), &ccm->analog_pll_video_denom);
> +
> + reg &= ~BM_ANADIG_PLL_VIDEO_POWERDOWN;
> + writel(reg, &ccm->analog_pll_video);
> +
> + while (timeout--)
> + if (readl(&ccm->analog_pll_video) & BM_ANADIG_PLL_VIDEO_LOCK)
> + break;
> + if (timeout < 0) {
> + printf("Warning: video pll lock timeout!\n");
> + return -ETIMEDOUT;
> + }
> +
> + reg = readl(&ccm->analog_pll_video);
> + reg |= BM_ANADIG_PLL_VIDEO_ENABLE;
> + reg &= ~BM_ANADIG_PLL_VIDEO_BYPASS;
> + writel(reg, &ccm->analog_pll_video);
> +
> + /* gate ipu1_di0_clk */
> + clrbits_le32(&ccm->CCGR3, MXC_CCM_CCGR3_LDB_DI0_MASK);
> +
> + /* select video_pll clock / 7 for ipu1_di0_clk -> 65MHz pixclock */
> + reg = readl(&ccm->chsccdr);
> + reg &= ~(MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_MASK |
> + MXC_CCM_CHSCCDR_IPU1_DI0_PODF_MASK |
> + MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_MASK);
> + reg |= (2 << MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_OFFSET) |
> + (6 << MXC_CCM_CHSCCDR_IPU1_DI0_PODF_OFFSET) |
> + (0 << MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET);
> + writel(reg, &ccm->chsccdr);
> +
> + /* enable ipu1_di0_clk */
> + setbits_le32(&ccm->CCGR3, MXC_CCM_CCGR3_LDB_DI0_MASK);
> +
> + return 0;
> +}
> +#endif /* CONFIG_VIDEO_IPUV3 */
> +
> int board_early_init_f(void)
> {
> + int ret = 0;
> setup_iomux_uart();
> - return 0;
> +
> +#ifdef CONFIG_VIDEO_IPUV3
> + ret = setup_display();
> +#endif
> + return ret;
> }
>
> int board_init(void)
> diff --git a/include/configs/mx6cuboxi.h b/include/configs/mx6cuboxi.h
> index b569f34..207a2a6 100644
> --- a/include/configs/mx6cuboxi.h
> +++ b/include/configs/mx6cuboxi.h
> @@ -27,7 +27,7 @@
> #define CONFIG_IMX6_THERMAL
> #define CONFIG_SYS_GENERIC_BOARD
>
> -#define CONFIG_SYS_MALLOC_LEN (2 * SZ_1M)
> +#define CONFIG_SYS_MALLOC_LEN (10 * SZ_1M)
> #define CONFIG_BOARD_EARLY_INIT_F
> #define CONFIG_BOARD_LATE_INIT
> #define CONFIG_MXC_GPIO
> @@ -66,6 +66,22 @@
> #define CONFIG_CONS_INDEX 1
> #define CONFIG_BAUDRATE 115200
>
> +/* Framebuffer */
> +#define CONFIG_VIDEO
> +#define CONFIG_VIDEO_IPUV3
> +#define CONFIG_IPUV3_CLK 260000000
> +#define CONFIG_CFB_CONSOLE
> +#define CONFIG_VGA_AS_SINGLE_DEVICE
> +#define CONFIG_SYS_CONSOLE_IS_IN_ENV
> +#define CONFIG_VIDEO_BMP_RLE8
> +#define CONFIG_SPLASH_SCREEN
> +#define CONFIG_SPLASH_SCREEN_ALIGN
> +#define CONFIG_BMP_16BPP
> +#define CONFIG_VIDEO_LOGO
> +#define CONFIG_VIDEO_BMP_LOGO
> +#define CONFIG_IMX_HDMI
> +#define CONFIG_IMX_VIDEO_SKIP
> +
> #define CONFIG_SYS_NO_FLASH
>
> /* Command definition */
> --
> 1.9.1
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 818 bytes
Desc: not available
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20150430/a672b50a/attachment.sig>
More information about the U-Boot
mailing list