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_video(struct video_para *video) { unsigned int id = get_vid(video->vic); glb_video.vic = video->vic; switch(glb_video.vic) { case 2: case 4: case 6: case 17: case 19: case 21: 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); if((ptbl[id].para[0] == 32) || (ptbl[id].para[0] == 160)|| (ptbl[id].para[0] == 257)|| (ptbl[id].para[0] == 258)) { hdmi_write(0xC045, 0x01); } else { hdmi_write(0xC045, 0x00); } 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; }
static int hdmi_phy_set(struct video_para *video) { unsigned int id; id = get_vid(video->vic); switch(ptbl[id].para[1]) { case 1: hdmi_write(0x2241, 0x06); hdmi_write(0xA240, 0x00); hdmi_write(0xA241, 0x00); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); hdmi_write(0x2241, 0x15); hdmi_write(0xA240, 0x00); hdmi_write(0xA241, 0x0f); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); hdmi_write(0x2241, 0x10); hdmi_write(0xA240, 0x00); hdmi_write(0xA241, 0x00); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); hdmi_write(0x2241, 0x19); hdmi_write(0xA240, 0x00); hdmi_write(0xA241, 0x02); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); hdmi_write(0x2241, 0x0e); hdmi_write(0xA240, 0x00); hdmi_write(0xA241, 0x00); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); hdmi_write(0x2241, 0x09); hdmi_write(0xA240, 0x80); hdmi_write(0xA241, 0x2b); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); break; case 2: hdmi_write(0x2241, 0x06); hdmi_write(0xA240, 0x04); hdmi_write(0xA241, 0xa0); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); hdmi_write(0x2241, 0x15); hdmi_write(0xA240, 0x00); hdmi_write(0xA241, 0x0a); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); hdmi_write(0x2241, 0x10); hdmi_write(0xA240, 0x00); hdmi_write(0xA241, 0x00); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); hdmi_write(0x2241, 0x19); hdmi_write(0xA240, 0x00); hdmi_write(0xA241, 0x02); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); hdmi_write(0x2241, 0x0e); hdmi_write(0xA240, 0x00); hdmi_write(0xA241, 0x21); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); hdmi_write(0x2241, 0x09); hdmi_write(0xA240, 0x80); hdmi_write(0xA241, 0x29); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); break; case 4: hdmi_write(0x2241, 0x06); hdmi_write(0xA240, 0x05); hdmi_write(0xA241, 0x40); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); hdmi_write(0x2241, 0x15); hdmi_write(0xA240, 0x00); hdmi_write(0xA241, 0x05); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); hdmi_write(0x2241, 0x10); hdmi_write(0xA240, 0x00); hdmi_write(0xA241, 0x00); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); hdmi_write(0x2241, 0x19); hdmi_write(0xA240, 0x00); hdmi_write(0xA241, 0x07); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); hdmi_write(0x2241, 0x0e); hdmi_write(0xA240, 0x02); hdmi_write(0xA241, 0xb5); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); hdmi_write(0x2241, 0x09); hdmi_write(0xA240, 0x80); hdmi_write(0xA241, 0x09); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); break; case 11: hdmi_write(0x2241, 0x06); hdmi_write(0xA240, 0x01); hdmi_write(0xA241, ptbl[id].para[2] ? 0xe3 : 0xe0); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); hdmi_write(0x2241, 0x15); hdmi_write(0xA240, 0x00); hdmi_write(0xA241, 0x00); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); hdmi_write(0x2241, 0x10); hdmi_write(0xA240, 0x08); hdmi_write(0xA241, 0xda); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); hdmi_write(0x2241, 0x19); hdmi_write(0xA240, 0x00); hdmi_write(0xA241, 0x07); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); hdmi_write(0x2241, 0x0E); hdmi_write(0xA240, 0x03); hdmi_write(0xA241, 0x18); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); hdmi_write(0x2241, 0x09); hdmi_write(0xA240, 0x80); hdmi_write(0xA241, 0x09); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); break; default: return -1; } hdmi_write(0x2241, 0x1e); hdmi_write(0xA240, 0x00); hdmi_write(0xA241, 0x00); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); hdmi_write(0x2241, 0x13); hdmi_write(0xA240, 0x00); hdmi_write(0xA241, 0x00); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); hdmi_write(0x2241, 0x17); hdmi_write(0xA240, 0x00); hdmi_write(0xA241, 0x00); hdmi_write(0xA242, 0x10); hdmi_udelay(2000); hdmi_write(0x0240, 0x0e); return 0; }
static int hdmi_phy_set(struct video_para *video) { unsigned int id; unsigned int tmp; id = get_vid(video->vic); hdmi_writel(0x10020,hdmi_readl(0x10020)&(~0xf000)); switch(ptbl[id].para[1]) { case 1: hdmi_writel(0x1002c,0x39dc5fc0); hdmi_writel(0x10030,0x800843c0); 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,0x00FFFF7F); hdmi_writel(0x10024,0x80639000); 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,0x3bdc5040); hdmi_udelay(100000); tmp = hdmi_readl(0x10038); hdmi_writel(0x1002c,0xfbdc5040); hdmi_writel(0x1002c,hdmi_readl(0x1002c)|((tmp&0x1f800)>>11)); hdmi_writel(0x10020,0x00FFFF7F); hdmi_writel(0x10024,0x80639000); hdmi_writel(0x10028,0x0F81C485); break; case 4: hdmi_writel(0x1002c,0x39dc5040); hdmi_writel(0x10030,0x80084343); hdmi_udelay(100000); hdmi_writel(0x10034,0x00000001); hdmi_writel(0x1002c,0x3bdc5040); hdmi_udelay(50000); tmp = hdmi_readl(0x10038); hdmi_writel(0x1002c,0xfbdc5040); hdmi_writel(0x1002c,hdmi_readl(0x1002c)|((tmp&0x1f800)>>11)); hdmi_writel(0x10020,0x00FFFF7F); hdmi_writel(0x10024,0x80639000); 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,0x3bdc5040); hdmi_udelay(100000); tmp = hdmi_readl(0x10038); hdmi_writel(0x1002c,0xfbdc5040); hdmi_writel(0x1002c,hdmi_readl(0x1002c)|((tmp&0x1f800)>>11)); hdmi_writel(0x10020,0x00FFFF7F); hdmi_writel(0x10024,0x80639000); hdmi_writel(0x10028,0x0F81C405); break; default: return -1; } return 0; }
int bsp_hdmi_video(struct video_para *video) { unsigned id = get_vid(video->vic); glb_video.vic = video->vic; bsp_hdmi_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, video->is_yuv ? 0x09 : 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[16] == 0) hdmi_write(0xC044, (video->csc << 6) | 0x18); else if(ptbl[id].para[16] == 1) hdmi_write(0xC044, (video->csc << 6) | 0x28); else hdmi_write(0xC044, (video->csc << 6) | 0x08); hdmi_write(0xC045, 0x00); hdmi_write(0x4046, ptbl[id].para[0]&0x7f); } if(video->is_hcts) { 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(0x10010,0x52); hdmi_write(0x10011,0x54); hdmi_write(0x10012,0x41); hdmi_write(0x10013,0x57); } hdmi_write(0x0082, 0x00); hdmi_write(0x0081, 0x00); if(hdmi_phy_set(video)!=0) return -1; hdmi_write(0x0840, 0x00); if(video->is_hcts) { } return 0; }