From b0edf38954ed4fb77ef5860b3ca158c36e62e0a6 Mon Sep 17 00:00:00 2001 From: hehopmajieh Dimitar gamishev Date: Wed, 5 Dec 2018 22:31:56 +0200 Subject: [PATCH] Added new files missed by commit f1687a208da1d01b96d77c78e2121d0090260b12 --- .../video/sunxi/disp2/disp/de/disp_display.c | 8 + .../video/sunxi/disp2/hdmi/hdmi_bsp_i.h | 59 ++ .../sunxi/disp2/hdmi/hdmi_bsp_sun50iw1p1.c | 669 ++++++++++++++++++ 3 files changed, 736 insertions(+) create mode 100644 SOFTWARE/A64-TERES/linux-a64/drivers/video/sunxi/disp2/hdmi/hdmi_bsp_i.h create mode 100644 SOFTWARE/A64-TERES/linux-a64/drivers/video/sunxi/disp2/hdmi/hdmi_bsp_sun50iw1p1.c diff --git a/SOFTWARE/A64-TERES/linux-a64/drivers/video/sunxi/disp2/disp/de/disp_display.c b/SOFTWARE/A64-TERES/linux-a64/drivers/video/sunxi/disp2/disp/de/disp_display.c index 82342adf..0795bab6 100755 --- a/SOFTWARE/A64-TERES/linux-a64/drivers/video/sunxi/disp2/disp/de/disp_display.c +++ b/SOFTWARE/A64-TERES/linux-a64/drivers/video/sunxi/disp2/disp/de/disp_display.c @@ -803,6 +803,14 @@ s32 bsp_disp_get_screen_height_from_output_type(u32 disp, u32 output_type, u32 o width = 3840; height = 2160; break; + case DISP_TV_MOD_800_480P: + width = 800; + height = 480; + break; + case DISP_TV_MOD_1024_600P: + width = 1024; + height = 600; + break; } } /* FIXME: add other output device res */ diff --git a/SOFTWARE/A64-TERES/linux-a64/drivers/video/sunxi/disp2/hdmi/hdmi_bsp_i.h b/SOFTWARE/A64-TERES/linux-a64/drivers/video/sunxi/disp2/hdmi/hdmi_bsp_i.h new file mode 100644 index 00000000..cb9bea1d --- /dev/null +++ b/SOFTWARE/A64-TERES/linux-a64/drivers/video/sunxi/disp2/hdmi/hdmi_bsp_i.h @@ -0,0 +1,59 @@ +#ifndef __HDMI_BSP_I_H_ +#define __HDMI_BSP_I_H_ + +// Taken from https://raw.githubusercontent.com/allwinner-zh/linux-3.4-sunxi/master/drivers/video/sunxi/disp2/hdmi/aw/hdmi_bsp_i.h + +#define BIT0 0x00000001 +#define BIT1 0x00000002 +#define BIT2 0x00000004 +#define BIT3 0x00000008 +#define BIT4 0x00000010 +#define BIT5 0x00000020 +#define BIT6 0x00000040 +#define BIT7 0x00000080 +#define BIT8 0x00000100 +#define BIT9 0x00000200 +#define BIT10 0x00000400 +#define BIT11 0x00000800 +#define BIT12 0x00001000 +#define BIT13 0x00002000 +#define BIT14 0x00004000 +#define BIT15 0x00008000 +#define BIT16 0x00010000 +#define BIT17 0x00020000 +#define BIT18 0x00040000 +#define BIT19 0x00080000 +#define BIT20 0x00100000 +#define BIT21 0x00200000 +#define BIT22 0x00400000 +#define BIT23 0x00800000 +#define BIT24 0x01000000 +#define BIT25 0x02000000 +#define BIT26 0x04000000 +#define BIT27 0x08000000 +#define BIT28 0x10000000 +#define BIT29 0x20000000 +#define BIT30 0x40000000 +#define BIT31 0x80000000 + + + +//#define get_value(addr) (*((volatile unsigned char *)(addr))) +//#define put_value(addr, v) (*((volatile unsigned char *)(addr)) = (unsigned char)(v)) +#define get_bvalue(addr) (*((volatile unsigned char *)(addr))) +#define put_bvalue(addr, v) (*((volatile unsigned char *)(addr)) = (unsigned char)(v)) +#define get_hvalue(addr) (*((volatile unsigned short *)(addr))) +#define put_hvalue(addr, v) (*((volatile unsigned short *)(addr)) = (unsigned short)(v)) +#define get_wvalue(addr) (*((volatile unsigned long *)(addr))) +#define put_wvalue(addr, v) (*((volatile unsigned long *)(addr)) = (unsigned long)(v)) + +//#define set_bit(addr, v) (*((volatile unsigned char *)(addr)) |= (unsigned char)(v)) +//#define clr_bit(addr, v) (*((volatile unsigned char *)(addr)) &= ~(unsigned char)(v)) +#define set_bbit(addr, v) (*((volatile unsigned char *)(addr)) |= (unsigned char)(v)) +#define clr_bbit(addr, v) (*((volatile unsigned char *)(addr)) &= ~(unsigned char)(v)) +#define set_hbit(addr, v) (*((volatile unsigned short *)(addr)) |= (unsigned short)(v)) +#define clr_hbit(addr, v) (*((volatile unsigned short *)(addr)) &= ~(unsigned short)(v)) +#define set_wbit(addr, v) (*((volatile unsigned long *)(addr)) |= (unsigned long)(v)) +#define clr_wbit(addr, v) (*((volatile unsigned long *)(addr)) &= ~(unsigned long)(v)) + +#endif diff --git a/SOFTWARE/A64-TERES/linux-a64/drivers/video/sunxi/disp2/hdmi/hdmi_bsp_sun50iw1p1.c b/SOFTWARE/A64-TERES/linux-a64/drivers/video/sunxi/disp2/hdmi/hdmi_bsp_sun50iw1p1.c new file mode 100644 index 00000000..ed6a2bf4 --- /dev/null +++ b/SOFTWARE/A64-TERES/linux-a64/drivers/video/sunxi/disp2/hdmi/hdmi_bsp_sun50iw1p1.c @@ -0,0 +1,669 @@ +#include "hdmi_bsp_i.h" +#include "hdmi_core.h" +#include "hdmi_bsp.h" + +static unsigned long long hdmi_base_addr_v2; +static struct video_para glb_video; +static unsigned int hdmi_version; +//static struct audio_para glb_audio; + +static int hdmi_phy_set(struct video_para *video); + +struct para_tab +{ + unsigned int para[19]; +}; + +struct pcm_sf +{ + unsigned int sf; + unsigned char cs_sf; +}; + +struct para_tab ptbl[] = +{ + {{6 , 1 , 1, 1, 5, 3, 0, 1, 4, 0, 0, 160, 20, 38, 124, 240, 22, 0, 0 }}, + {{21 , 11, 1, 1, 5, 3, 1, 1, 2, 0, 0, 160, 32, 24, 126, 32, 24, 0, 0 }}, + {{2 , 11, 0, 0, 2, 6, 1, 0, 9, 0, 0, 208, 138, 16, 62, 224, 45, 0, 0 }}, + {{17 , 11, 0, 0, 2, 5, 2, 0, 5, 0, 0, 208, 144, 12, 64, 64, 49, 0, 0 }}, + {{19 , 4 , 0, 96, 5, 5, 2, 2, 5, 1, 0, 0, 188, 184, 40, 208, 30, 1, 1 }}, + {{4 , 4 , 0, 96, 5, 5, 2, 1, 5, 0, 0, 0, 114, 110, 40, 208, 30, 1, 1 }}, + {{20 , 4 , 0, 97, 7, 5, 4, 2, 2, 2, 0, 128, 208, 16, 44, 56, 22, 1, 1 }}, + {{5 , 4 , 0, 97, 7, 5, 4, 1, 2, 0, 0, 128, 24, 88, 44, 56, 22, 1, 1 }}, + {{31 , 2 , 0, 96, 7, 5, 4, 2, 4, 2, 0, 128, 208, 16, 44, 56, 45, 1, 1 }}, + {{16 , 2 , 0, 96, 7, 5, 4, 1, 4, 0, 0, 128, 24, 88, 44, 56, 45, 1, 1 }}, + {{32 , 4 , 0, 96, 7, 5, 4, 3, 4, 2, 0, 128, 62, 126, 44, 56, 45, 1, 1 }}, + {{33 , 4 , 0, 0, 7, 5, 4, 2, 4, 2, 0, 128, 208, 16, 44, 56, 45, 1, 1 }}, + {{34 , 4 , 0, 0, 7, 5, 4, 1, 4, 0, 0, 128, 24, 88, 44, 56, 45, 1, 1 }}, + {{160 , 2 , 0, 96, 7, 5, 8, 3, 4, 1, 0, 128, 62, 126, 44, 157, 45, 1, 1 }}, + {{147 , 2 , 0, 96, 5, 5, 5, 2, 5, 1, 0, 0, 188, 184, 40, 190, 30, 1, 1 }}, + {{132 , 2 , 0, 96, 5, 5, 5, 1, 5, 0, 0, 0, 114, 110, 40, 160, 30, 1, 1 }}, + {{257 , 1 , 0, 96, 15, 10, 8, 2, 8, 0, 0, 0, 48, 176, 88, 112, 90, 1, 1 }}, + {{258 , 1 , 0, 96, 15, 10, 8, 5, 8, 4, 0, 0, 160, 32, 88, 112, 90, 1, 1 }}, + {{35 , 11, 0, 0, 1, 3, 3, 0, 13, 0, 0, 208, 228, 80, 60, 208, 45, 0, 0 }}, +}; + +static unsigned char ca_table[64]= +{ + 0x00,0x11,0x01,0x13,0x02,0x31,0x03,0x33, + 0x04,0x15,0x05,0x17,0x06,0x35,0x07,0x37, + 0x08,0x55,0x09,0x57,0x0a,0x75,0x0b,0x77, + 0x0c,0x5d,0x0d,0x5f,0x0e,0x7d,0x0f,0x7f, + 0x10,0xdd,0x11,0xdf,0x12,0xfd,0x13,0xff, + 0x14,0x99,0x15,0x9b,0x16,0xb9,0x17,0xbb, + 0x18,0x9d,0x19,0x9f,0x1a,0xbd,0x1b,0xbf, + 0x1c,0xdd,0x1d,0xdf,0x1e,0xfd,0x1f,0xff, +}; + +static struct pcm_sf sf[10] = +{ + {22050, 0x04}, + {44100, 0x00}, + {88200, 0x08}, + {176400,0x0c}, + {24000, 0x06}, + {48000, 0x02}, + {96000, 0x0a}, + {192000,0x0e}, + {32000, 0x03}, + {768000,0x09}, +}; + +static unsigned int n_table[21] = +{ + 32000, 3072, 4096, + 44100, 4704, 6272, + 88200, 4704*2, 6272*2, + 176400, 4704*4, 6272*4, + 48000, 5120, 6144, + 96000, 5120*2, 6144*2, + 192000, 5120*4, 6144*4, +}; + +static void hdmi_write(unsigned int addr, unsigned char data) +{ + put_bvalue(hdmi_base_addr_v2 + addr, data); +} + +static void hdmi_writel(unsigned int addr, unsigned int data) +{ + put_bvalue(hdmi_base_addr_v2 + addr, (data>>0) & 0xFF); + put_bvalue(hdmi_base_addr_v2 + addr + 1, (data>>8) & 0xFF); + put_bvalue(hdmi_base_addr_v2 + addr + 2, (data>>16) & 0xFF); + put_bvalue(hdmi_base_addr_v2 + addr + 3, (data>>24) & 0xFF); +} + +static unsigned char hdmi_read(unsigned int addr) +{ + return get_bvalue(hdmi_base_addr_v2 + addr); +} + +static unsigned int hdmi_readl(unsigned int addr) +{ + return + get_bvalue(hdmi_base_addr_v2 + addr + 0) + + get_bvalue(hdmi_base_addr_v2 + addr + 1) * 256 + + get_bvalue(hdmi_base_addr_v2 + addr + 2) * 256 * 256 + + get_bvalue(hdmi_base_addr_v2 + addr + 3) * 256 * 256 * 256; +} + +static hdmi_bsp_func *hdmi_bsp_funcs; + +int bsp_hdmi_set_func(hdmi_bsp_func *func) +{ + hdmi_bsp_funcs = func; + return 0; +} + +void hdmi_delay_us(unsigned long us); + +void hdmi_udelay(unsigned long us) +{ + //if (hdmi_bsp_funcs->delay_us) + // hdmi_bsp_funcs->delay_us(delay); + hdmi_delay_us(us); +} + +void hdmi_phy_init(struct video_para *video) +{ + unsigned int to_cnt; + unsigned int tmp; + + hdmi_writel(0x10020,0); + hdmi_writel(0x10020,(1<<0)); + hdmi_udelay(5); + hdmi_writel(0x10020,hdmi_readl(0x10020)|(1<<16)); + hdmi_writel(0x10020,hdmi_readl(0x10020)|(1<<1)); + hdmi_udelay(10); + hdmi_writel(0x10020,hdmi_readl(0x10020)|(1<<2)); + hdmi_udelay(5); + hdmi_writel(0x10020,hdmi_readl(0x10020)|(1<<3)); + hdmi_udelay(40); + hdmi_writel(0x10020,hdmi_readl(0x10020)|(1<<19)); + hdmi_udelay(100); + hdmi_writel(0x10020,hdmi_readl(0x10020)|(1<<18)); + hdmi_writel(0x10020,hdmi_readl(0x10020)|(7<<4)); + to_cnt = 10; + while(1) + { + if( (hdmi_readl(0x10038)&0x80) == 0x80 ) + break; + hdmi_udelay(200); + + to_cnt--; + if(to_cnt == 0) { + __wrn("%s, timeout\n", __func__); + break; + } + } + hdmi_writel(0x10020,hdmi_readl(0x10020)|(0xf<<8)); +// hdmi_writel(0x10020,hdmi_readl(0x10020)&(~(1<<19))); + hdmi_writel(0x10020,hdmi_readl(0x10020)|(1<<7)); +// hdmi_writel(0x10020,hdmi_readl(0x10020)|(0xf<<12)); + + hdmi_writel(0x1002c,0x39dc5040); + hdmi_writel(0x10030,0x80084343); + hdmi_udelay(10000); + hdmi_writel(0x10034,0x00000001); + hdmi_writel(0x1002c,hdmi_readl(0x1002c)|0x02000000); + hdmi_udelay(100000); + tmp = hdmi_readl(0x10038); + hdmi_writel(0x1002c,hdmi_readl(0x1002c)|0xC0000000); + hdmi_writel(0x1002c,hdmi_readl(0x1002c)|((tmp&0x1f800)>>11)); + hdmi_writel(0x10020,0x01FF0F7F); + hdmi_writel(0x10024,0x80639000); + hdmi_writel(0x10028,0x0F81C405); +} + +static unsigned int get_vid(unsigned int id) +{ + unsigned int i,count; + count = sizeof(ptbl)/sizeof(struct para_tab); + for(i=0;ivic); + hdmi_writel(0x10020,hdmi_readl(0x10020)&(~0xf000)); + switch(ptbl[id].para[1]) + { + case 1: + if(hdmi_version == 0) + hdmi_writel(0x1002c,0x31dc5fc0); + else + hdmi_writel(0x1002c,0x30dc5fc0); + hdmi_writel(0x10030,0x800863C0); + hdmi_udelay(10000); + hdmi_writel(0x10034,0x00000001); + hdmi_writel(0x1002c,hdmi_readl(0x1002c)|0x02000000); + hdmi_udelay(200000); + tmp = hdmi_readl(0x10038); + hdmi_writel(0x1002c,hdmi_readl(0x1002c)|0xC0000000); + if(((tmp&0x1f800)>>11) < 0x3d) + hdmi_writel(0x1002c,hdmi_readl(0x1002c)|(((tmp&0x1f800)>>11)+2)); + else + hdmi_writel(0x1002c,hdmi_readl(0x1002c)|0x3f); + hdmi_udelay(100000); + hdmi_writel(0x10020,0x01FFFF7F); + hdmi_writel(0x10024,0x8063b000); + hdmi_writel(0x10028,0x0F8246B5); + break; + case 2: + hdmi_writel(0x1002c,0x39dc5040); + hdmi_writel(0x10030,0x80084381); + hdmi_udelay(10000); + hdmi_writel(0x10034,0x00000001); + hdmi_writel(0x1002c,hdmi_readl(0x1002c)|0x02000000); + hdmi_udelay(100000); + tmp = hdmi_readl(0x10038); + hdmi_writel(0x1002c,hdmi_readl(0x1002c)|0xC0000000); + hdmi_writel(0x1002c,hdmi_readl(0x1002c)|((tmp&0x1f800)>>11)); + hdmi_writel(0x10020,0x01FFFF7F); + hdmi_writel(0x10024,0x8063a800); + hdmi_writel(0x10028,0x0F81C485); + break; + case 4: + hdmi_writel(0x1002c,0x39dc5040); + hdmi_writel(0x10030,0x80084343); + hdmi_udelay(10000); + hdmi_writel(0x10034,0x00000001); + hdmi_writel(0x1002c,hdmi_readl(0x1002c)|0x02000000); + hdmi_udelay(100000); + tmp = hdmi_readl(0x10038); + hdmi_writel(0x1002c,hdmi_readl(0x1002c)|0xC0000000); + hdmi_writel(0x1002c,hdmi_readl(0x1002c)|((tmp&0x1f800)>>11)); + hdmi_writel(0x10020,0x01FFFF7F); + hdmi_writel(0x10024,0x8063b000); + hdmi_writel(0x10028,0x0F81C405); + break; + case 11: + hdmi_writel(0x1002c,0x39dc5040); + hdmi_writel(0x10030,0x8008430a); + hdmi_udelay(10000); + hdmi_writel(0x10034,0x00000001); + hdmi_writel(0x1002c,hdmi_readl(0x1002c)|0x02000000); + hdmi_udelay(100000); + tmp = hdmi_readl(0x10038); + hdmi_writel(0x1002c,hdmi_readl(0x1002c)|0xC0000000); + hdmi_writel(0x1002c,hdmi_readl(0x1002c)|((tmp&0x1f800)>>11)); + hdmi_writel(0x10020,0x01FFFF7F); + hdmi_writel(0x10024,0x8063b000); + hdmi_writel(0x10028,0x0F81C405); + break; + default: + return -1; + } + return 0; +} + +void bsp_hdmi_set_version(unsigned int version) +{ + hdmi_version = version; +} + +void bsp_hdmi_set_addr(uintptr_t base_addr) +{ + hdmi_base_addr_v2 = (unsigned long long)base_addr; +} + +void bsp_hdmi_inner_init(void) +{ + hdmi_write(0x10010,0x45); + hdmi_write(0x10011,0x45); + hdmi_write(0x10012,0x52); + hdmi_write(0x10013,0x54); + hdmi_write(0x8080, 0x00); + hdmi_udelay(1); + hdmi_write(0xF01F, 0x00); + hdmi_write(0x8403, 0xff); + hdmi_write(0x904C, 0xff); + hdmi_write(0x904E, 0xff); + hdmi_write(0xD04C, 0xff); + hdmi_write(0x8250, 0xff); + hdmi_write(0x8A50, 0xff); + hdmi_write(0x8272, 0xff); + hdmi_write(0x40C0, 0xff); + hdmi_write(0x86F0, 0xff); + hdmi_write(0x0EE3, 0xff); + hdmi_write(0x8EE2, 0xff); + hdmi_write(0xA049, 0xf0); + hdmi_write(0xB045, 0x1e); + hdmi_write(0x00C1, 0x00); + hdmi_write(0x00C1, 0x03); + hdmi_write(0x00C0, 0x00); + hdmi_write(0x40C1, 0x10); +// hdmi_write(0x0081, 0xff); +// hdmi_write(0x0081, 0x00); +// hdmi_write(0x0081, 0xff); + hdmi_write(0x0010, 0xff); + hdmi_write(0x0011, 0xff); + hdmi_write(0x8010, 0xff); + hdmi_write(0x8011, 0xff); + hdmi_write(0x0013, 0xff); + hdmi_write(0x8012, 0xff); + hdmi_write(0x8013, 0xff); +} + +void bsp_hdmi_init() +{ + struct video_para vpara; + vpara.vic = 17; + hdmi_phy_init(&vpara); + bsp_hdmi_inner_init(); +} + +void bsp_hdmi_set_video_en(unsigned char enable) +{ + if(enable) + hdmi_writel(0x10020,hdmi_readl(0x10020)|(0xf<<12)); + else + hdmi_writel(0x10020,hdmi_readl(0x10020)&(~(0xf<<12))); +} + +int bsp_hdmi_video(struct video_para *video) +{ + unsigned int id = get_vid(video->vic); + glb_video.vic = video->vic; + + switch(glb_video.vic) + { + case 2: + case 6: + case 17: + case 21: + case 35: + case 36: + video->csc = BT601; + break; + default: + video->csc = BT709; + break; + } + if(hdmi_phy_set(video)!=0) + return -1; + + bsp_hdmi_inner_init(); + + hdmi_write(0x0840, 0x01); + hdmi_write(0x4845, 0x00); + hdmi_write(0x0040, ptbl[id].para[3] | 0x10); + hdmi_write(0x10001, ( (ptbl[id].para[3] < 96) ? 0x03 : 0x00 ) ); + hdmi_write(0x8040, ptbl[id].para[4]); + hdmi_write(0x4043, ptbl[id].para[5]); + hdmi_write(0x8042, ptbl[id].para[6]); + hdmi_write(0x0042, ptbl[id].para[7]); + hdmi_write(0x4042, ptbl[id].para[8]); + hdmi_write(0x4041, ptbl[id].para[9]); + hdmi_write(0xC041, ptbl[id].para[10]); + hdmi_write(0x0041, ptbl[id].para[11]); + hdmi_write(0x8041, ptbl[id].para[12]); + hdmi_write(0x4040, ptbl[id].para[13]); + hdmi_write(0xC040, ptbl[id].para[14]); + hdmi_write(0x0043, ptbl[id].para[15]); + hdmi_write(0x8043, ptbl[id].para[16]); + hdmi_write(0x0045, 0x0c); + hdmi_write(0x8044, 0x20); + hdmi_write(0x8045, 0x01); + hdmi_write(0x0046, 0x0b); + hdmi_write(0x0047, 0x16); + hdmi_write(0x8046, 0x21); + hdmi_write(0x3048, ptbl[id].para[2] ? 0x21 : 0x10); + hdmi_write(0x0401, ptbl[id].para[2] ? 0x41 : 0x40); + hdmi_write(0x8400, 0x07); + hdmi_write(0x8401, 0x00); + hdmi_write(0x0402, 0x47); + hdmi_write(0x0800, 0x01); + hdmi_write(0x0801, 0x07); + hdmi_write(0x8800, 0x00); + hdmi_write(0x8801, 0x00); + hdmi_write(0x0802, 0x00); + hdmi_write(0x0803, 0x00); + hdmi_write(0x8802, 0x00); + hdmi_write(0x8803, 0x00); + + if(video->is_hdmi) + { + hdmi_write(0xB045, 0x08); + hdmi_write(0x2045, 0x00); + hdmi_write(0x2044, 0x0c); + hdmi_write(0x6041, 0x03); + hdmi_write(0xA044, ((ptbl[id].para[0]&0x100) == 0x100) ? 0x20 : ( ((ptbl[id].para[0]&0x80) == 0x80) ? 0x40 : 0x00) ); + hdmi_write(0xA045, ((ptbl[id].para[0]&0x100) == 0x100) ? (ptbl[id].para[0]&0x7f) : 0x00); + hdmi_write(0x2046, 0x00); + hdmi_write(0x3046, 0x01); + hdmi_write(0x3047, 0x11); + hdmi_write(0x4044, 0x00); + hdmi_write(0x0052, 0x00); + hdmi_write(0x8051, 0x11); + hdmi_write(0x10010,0x45); + hdmi_write(0x10011,0x45); + hdmi_write(0x10012,0x52); + hdmi_write(0x10013,0x54); + hdmi_write(0x0040, hdmi_read(0x0040) | 0x08 ); + hdmi_write(0x10010,0x52); + hdmi_write(0x10011,0x54); + hdmi_write(0x10012,0x41); + hdmi_write(0x10013,0x57); + hdmi_write(0x4045, video->is_yuv ? 0x02 : 0x00); + if(ptbl[id].para[17] == 0) + hdmi_write(0xC044, (video->csc << 6) | 0x18); + else if(ptbl[id].para[17] == 1) + hdmi_write(0xC044, (video->csc << 6) | 0x28); + else + hdmi_write(0xC044, (video->csc << 6) | 0x08); + + hdmi_write(0xC045, video->is_yuv ? 0x00 : 0x08); + hdmi_write(0x4046, ptbl[id].para[0]&0x7f); + } + + if(video->is_hcts) + { + hdmi_write(0x00C0, video->is_hdmi ? 0x91 : 0x90 ); + hdmi_write(0x00C1, 0x05); + hdmi_write(0x40C1, (ptbl[id].para[3] < 96) ? 0x10 : 0x1a); + hdmi_write(0x80C2, 0xff); + hdmi_write(0x40C0, 0xfd); + hdmi_write(0xC0C0, 0x40); + hdmi_write(0x00C1, 0x04); + hdmi_write(0x10010,0x45); + hdmi_write(0x10011,0x45); + hdmi_write(0x10012,0x52); + hdmi_write(0x10013,0x54); + hdmi_write(0x0040, hdmi_read(0x0040) | 0x80 ); + hdmi_write(0x00C0, video->is_hdmi ? 0x95 : 0x94 ); + hdmi_write(0x10010,0x52); + hdmi_write(0x10011,0x54); + hdmi_write(0x10012,0x41); + hdmi_write(0x10013,0x57); + } + + hdmi_write(0x0082, 0x00); + hdmi_write(0x0081, 0x00); + + hdmi_write(0x0840, 0x00); + + if(video->is_hcts) + { + + } + + return 0; +} + +int bsp_hdmi_audio(struct audio_para *audio) +{ + unsigned int i; + unsigned int n; + unsigned id = get_vid(glb_video.vic); + + hdmi_write(0xA049, (audio->ch_num > 2) ? 0xf1 : 0xf0); + + for(i = 0; i < 64; i += 2) + { + if(audio->ca == ca_table[i]) + { + hdmi_write(0x204B, ~ca_table[i+1]); + break; + } + } + hdmi_write(0xA04A, 0x00); + hdmi_write(0xA04B, 0x30); + hdmi_write(0x6048, 0x00); + hdmi_write(0x6049, 0x01); + hdmi_write(0xE048, 0x42); + hdmi_write(0xE049, 0x86); + hdmi_write(0x604A, 0x31); + hdmi_write(0x604B, 0x75); + hdmi_write(0xE04A, 0x00 | 0x01); + for(i = 0; i < 10; i += 1) + { + if(audio->sample_rate == sf[i].sf) + { + hdmi_write(0xE04A, 0x00 | sf[i].cs_sf); + break; + } + } + hdmi_write(0xE04B, 0x00 | + (audio->sample_bit == 16) ? 0x02 : ((audio->sample_bit == 24) ? 0xb : 0x0) ); + + + hdmi_write(0x0251, audio->sample_bit); + + + + n = 6272; + //cts = 0; + for(i = 0; i < 21; i += 3) + { + if(audio->sample_rate == n_table[i]) + { + if(ptbl[id].para[1] == 1) + n = n_table[i+1]; + else + n = n_table[i+2]; + + //cts = (n / 128) * (glb_video.tmds_clk / 100) / (audio->sample_rate / 100); + break; + } + } + + hdmi_write(0x0A40, n); + hdmi_write(0x0A41, n >> 8); + hdmi_write(0x8A40, n >> 16); + hdmi_write(0x0A43, 0x00); + hdmi_write(0x8A42, 0x04); + hdmi_write(0xA049, (audio->ch_num > 2) ? 0x01 : 0x00); + hdmi_write(0x2043, audio->ch_num * 16); + hdmi_write(0xA042, 0x00); + hdmi_write(0xA043, audio->ca); + hdmi_write(0x6040, 0x00); + + if(audio->type == PCM) + { + hdmi_write(0x8251, 0x00); + } + else if((audio->type == DTS_HD) || (audio->type == DDP)) + { + hdmi_write(0x8251, 0x03); + hdmi_write(0x0251, 0x15); + hdmi_write(0xA043, 0); + } + else + { + hdmi_write(0x8251, 0x02); + hdmi_write(0x0251, 0x15); + hdmi_write(0xA043, 0); + } + + hdmi_write(0x0250, 0x00); + hdmi_write(0x0081, 0x08); + hdmi_write(0x8080, 0xf7); + hdmi_udelay(100); + hdmi_write(0x0250, 0xaf); + hdmi_udelay(100); + hdmi_write(0x0081, 0x00); + + return 0; +} + +int bsp_hdmi_ddc_read(char cmd,char pointer,char offset,int nbyte,char * pbuf) +{ + unsigned char off = offset; + unsigned int to_cnt; + int ret = 0; + + hdmi_write(0x10010,0x45); + hdmi_write(0x10011,0x45); + hdmi_write(0x10012,0x52); + hdmi_write(0x10013,0x54); + hdmi_write(0x4EE1, 0x00); + to_cnt = 50; + while((hdmi_read(0x4EE1)&0x01)!=0x01) + { + hdmi_udelay(10); + to_cnt--; //wait for 500us for timeout + if(to_cnt == 0) + { + __wrn("ddc rst timeout\n"); + break; + } + } + + hdmi_write(0x8EE3, 0x05); + hdmi_write(0x0EE3, 0x08); + hdmi_write(0x4EE2, 0xd8); + hdmi_write(0xCEE2, 0xfe); + + to_cnt = 10; + while(nbyte > 0) + { + to_cnt = 10; + hdmi_write(0x0EE0, 0xa0 >> 1); + hdmi_write(0x0EE1, off); + hdmi_write(0x4EE0, 0x60 >> 1); + hdmi_write(0xCEE0, pointer); + hdmi_write(0x0EE2, 0x02); + + while(1) + { + to_cnt--; //wait for 10ms for timeout + if(to_cnt == 0) + { + __wrn("ddc read timeout, byte cnt = %d\n",nbyte); + break; + } + if( (hdmi_read(0x0013) & 0x02) == 0x02) + { + hdmi_write(0x0013, hdmi_read(0x0013) & 0x02); + * pbuf++ = hdmi_read(0x8EE1); + break; + } + else if( (hdmi_read(0x0013) & 0x01) == 0x01) + { + hdmi_write(0x0013, hdmi_read(0x0013) & 0x01); + ret = -1; + break; + } + hdmi_udelay(1000); + } + nbyte --; + off ++; + } + hdmi_write(0x10010,0x52); + hdmi_write(0x10011,0x54); + hdmi_write(0x10012,0x41); + hdmi_write(0x10013,0x57); + + return ret; +} + +unsigned int bsp_hdmi_get_hpd() +{ + unsigned int ret = 0; + + hdmi_write(0x10010,0x45); + hdmi_write(0x10011,0x45); + hdmi_write(0x10012,0x52); + hdmi_write(0x10013,0x54); + + if(hdmi_readl(0x10038)&0x80000) + ret = 1; + else + ret = 0; + + hdmi_write(0x10010,0x52); + hdmi_write(0x10011,0x54); + hdmi_write(0x10012,0x41); + hdmi_write(0x10013,0x57); + + return ret; +} + +void bsp_hdmi_standby() +{ + hdmi_write(0x10020,0x07); + hdmi_write(0x1002c,0x00); +} + +void bsp_hdmi_hrst() +{ + hdmi_write(0x00C1, 0x04); +} + +void bsp_hdmi_hdl() +{ + +} + +int bsp_hdmi_cec_get_simple_msg(unsigned char *msg) +{ + return -1; +}