📄 hw_tw2834_api.c
字号:
#else ioctl_arg.addr = sub_addr; ioctl_arg.bank = page+1; ioctl_arg.len = length; for(ii=0; ii < length; ii++) ioctl_arg.data[ii] = *(data+ii); if (ioctl(fd_tw2834, REGISTER_WRITE, &ioctl_arg) < 0) { m_ERROR("tw2834.c: local bus write error\n"); sem_post(&tw2834_sem); return FAILURE; }#endif sem_post(&tw2834_sem); return SUCCESS;}RETURN tw2834_read_reg(UNS8 page, UNS8 sub_addr, UNS8 *data, UNS16 length){#ifdef I2C_INTERFACE UNS8 buf[4]; #else IOCTL_TW283X ioctl_arg;#endif sem_wait(&tw2834_sem);#ifdef I2C_INTERFACE if(ioctl(fd_tw2834, I2C_SLAVE_FORCE, TW2834_READ_CMD) < 0) { m_ERROR("tw2834.c: set slave addr error\n"); sem_post(&tw2834_sem); return FAILURE; }#else ioctl_arg.addr = sub_addr; ioctl_arg.bank = page+1; ioctl_arg.len = length; if (ioctl(fd_tw2834, REGISTER_READ, &ioctl_arg) < 0) { m_ERROR("tw2834.c: local bus read error\n"); sem_post(&tw2834_sem); return FAILURE; } memcpy(data, ioctl_arg.data, length);#endif#ifdef I2C_INTERFACE buf[0] = page; buf[1] = sub_addr; if(write(fd_tw2834, buf, 2) != 2) { m_ERROR("tw2834.c: sub addr write data error %x\n", sub_addr); sem_post(&tw2834_sem); return FAILURE; } if(read(fd_tw2834, data, length) != length) { m_ERROR("tw2834.c: read data error1\n"); sem_post(&tw2834_sem); return FAILURE; }#endif sem_post(&tw2834_sem); return SUCCESS;}/* only one font write */RETURN tw2834_write_font(S16 path, S16 posx, S16 posy, S16 color, S16 property, S16 font_index) { UNS8 buf[4]; posy |= CHAR_WR_MODE; /* Write 1 Character Line Attribute (bit[6:5]) */ if(path == Y_PATH) /* Write the display RAM of display(X_PATH) path or record path(Y_PATH) */ posy |=BIT7; /* display to the record path */ buf[0] = (UNS8)posy; buf[1] = (UNS8) ( CHAR_RD_FLD | FONT_PAGE0); buf[2] = CHAR_VF_SIZE | CHAR_HF_SIZE; buf[3] = (UNS8)posx; buf[4] = (UNS8)(color | property); IfBitSet(property,OSD_CLEAR) buf[5] = 0x00; else buf[5] = (UNS8)font_index; tw2834_burst_write_reg(TW2834_PAGE1, 0x9b, buf, 6); return SUCCESS;}/* string write to the fontRAM */RETURN tw2834_write_string(S16 path, S16 posx, S16 posy, S16 color, S16 property, UNS8 *str){ UNS8 buf[256], ii=0; UNS8 count, len; len = GetCodeLength(str); if(!len) return SUCCESS; posy |= CHAR_WR_MODE; /* Write 1 Character Line Attribute (bit[6:5]) */ if(path == Y_PATH) /* Write the display RAM of display(X_PATH) path or record path(Y_PATH) */ posy |=BIT7; /* display to the record path */ buf[0] = (UNS8)posy; buf[1] = (UNS8) ( CHAR_RD_FLD | FONT_PAGE0); buf[2] = CHAR_VF_SIZE | CHAR_HF_SIZE; buf[3] = (UNS8)posx; for(count=0; count<len; count++) { buf[4+ii] = (UNS8)(color | property); ++ii; IfBitSet(property, OSD_CLEAR) buf[4+ii] = 0x00; else IfBitSet(property,OSD_MODE_BMP) buf[4+ii] = OSD_MODE_BMP|(*str - ' '); /* font index */ else buf[4+ii]= *str - ' '; ii++; str++; } tw2834_burst_write_reg(TW2834_PAGE1, 0x9b, buf, 4 + ( len * 2)); return SUCCESS;}RETURN tw2834_osd_clear(S16 path){ /* display RAM clear ( x-path and y-path ) */ tw2834_write_reg(TW2834_PAGE1, 0xa0, (UNS8)path); /* must be delay */ usleep(100); return SUCCESS;}// pentamicro 2006.01.11/* for record path */RETURN tw2834_set_mux_rec(VIDEO_SIZE size, VIDEO_MODE mode) { int ii;#if 1//filter test UNS8 buf, peak_reg=0x00, anti_alia_reg=0x00, comb_reg=0x00, pal_delay_reg;#endif switch(size) { case D1: /* for D1 size */ /* frame capture */ tw2834_write_reg(TW2834_PAGE1, 0x56, 0xe0); /* mode : set to 720 mode in case of D1 */ tw2834_write_reg(TW2834_PAGE1, 0x51, 0x00); /* size: '0x00':quad, '0xFF':full */ tw2834_write_reg(TW2834_PAGE1, 0x6c, 0xff); /* position all ch : 0 */ tw2834_write_reg(TW2834_PAGE1, 0x6d, 0x00); for(ii=0; ii < 4; ii++) { /* switch mode */ tw2834_write_reg(TW2834_PAGE1, 0x60 + 0x03 * ii, 0xa0 | ii); /* horizontal size */ tw2834_write_reg(TW2834_PAGE0, 0x1e + 0x40 * ii, 0xff); /* vertical size */ tw2834_write_reg(TW2834_PAGE0, 0x1a + 0x40 * ii, 0xff); #if 1//filter test pal_delay_reg = mode==NTSC ? 0x07: 0x0f; /* pal delay line mode */ tw2834_read_reg(TW2834_PAGE0, 0x14 + 0x40*ii, &buf, 1); tw2834_write_reg(TW2834_PAGE0, 0x14 + 0x40*ii, (buf & 0x34) | peak_reg); tw2834_read_reg(TW2834_PAGE0, 0x15 + 0x40*ii, &buf, 1); tw2834_write_reg(TW2834_PAGE0, 0x15 + 0x40*ii, (buf & 0x33) | anti_alia_reg); tw2834_write_reg(TW2834_PAGE0, 0x17 + 0x40*ii, comb_reg); tw2834_write_reg(TW2834_PAGE0, 0x21 + 0x40*ii, pal_delay_reg); #else //org /* vertical anti-aliasing mode set for y-path( full bandwidth ) */ tw2834_write_reg(TW2834_PAGE0, 0x15 + 0x40 * ii, 0x00); #endif } /* PEIROD = 2 field update */ tw2834_write_reg(TW2834_PAGE1, 0x58, 0x01); break; case CIF: /* for CIF size */ /* frame capture */ tw2834_write_reg(TW2834_PAGE1, 0x56, 0xe0); /* mode : set to 704 mode in case of CIF */ tw2834_write_reg(TW2834_PAGE1, 0x51, 0x01); /* size: '0x00':quad, '0xFF':full */ tw2834_write_reg(TW2834_PAGE1, 0x6c, 0x00); /* position ch1: 0, ch2: 1, ch3: 2, ch4: 3 */ tw2834_write_reg(TW2834_PAGE1, 0x6d, 0xe4); for(ii=0; ii < 4; ii++) { /* live mode */ tw2834_write_reg(TW2834_PAGE1, 0x60 + 0x03 * ii, 0x80 | ii); /* horizontal size ( 1/2 ) */ tw2834_write_reg(TW2834_PAGE0, 0x1e + 0x40 * ii, 0x7f); /* vertical size ( 1/2 ) */ tw2834_write_reg(TW2834_PAGE0, 0x1a + 0x40 * ii, 0x7f); #if 1//filter test peak_reg = mode==NTSC ? 0xc8: 0x40;/* NTSC= 93.75% peaking, 2~4MHz band, PAL= 31.25% peaking, 4~5MHz band */ anti_alia_reg = mode==NTSC ? 0x84: 0x80;/* NTSC= 0.25 line band, 2MHz band, PAL= 0.25 line band, full band */ comb_reg = mode==NTSC ? 0x40: 0xc0;/* NTSC= Force trap filter mode, PAL= Wide band, Force trap */ pal_delay_reg = 0x07; /* vertical scaling mode */ tw2834_read_reg(TW2834_PAGE0, 0x14 + 0x40*ii, &buf, 1); tw2834_write_reg(TW2834_PAGE0, 0x14 + 0x40*ii, (buf & 0x34) | peak_reg); tw2834_read_reg(TW2834_PAGE0, 0x15 + 0x40*ii, &buf, 1); tw2834_write_reg(TW2834_PAGE0, 0x15 + 0x40*ii, (buf & 0x33) | anti_alia_reg); tw2834_write_reg(TW2834_PAGE0, 0x17 + 0x40*ii, comb_reg); tw2834_write_reg(TW2834_PAGE0, 0x21 + 0x40*ii, pal_delay_reg); #else //org /* vertical anti-aliasing mode set for y-path ( 0.25 line-rate bandwidth ) */ tw2834_write_reg(TW2834_PAGE0, 0x15 + 0x40 * ii, 0x80); #endif } /* PEIROD = 2 field update */ tw2834_write_reg(TW2834_PAGE1, 0x58, 0x01); break; default: break; } return SUCCESS; } RETURN tw2834_motion_block_init(UNS16 ch, VIDEO_MODE mode, BOOL flag) { if(flag) { if(mode == NTSC) tw2834_burst_write_reg(TW2834_PAGE2,0x60 + (ch * 8),tbl_ntsc_page2_ary_box, sizeof(tbl_ntsc_page2_ary_box)); else tw2834_burst_write_reg(TW2834_PAGE2,0x60 + (ch * 8),tbl_pal_page2_ary_box, sizeof(tbl_pal_page2_ary_box)); }else { tw2834_write_reg(TW2834_PAGE2, 0x60 + (ch * 8), 0x00); } return SUCCESS; } /* 2dbox position set for motion block */RETURN tw2834_cursor_set_pos(UNS16 ch, UNS16 posx, UNS16 posy) { unsigned char buf; buf = (posx << 4 ) & 0xf0; buf |= (posy & 0x0f); tw2834_write_reg(TW2834_PAGE2, 0x67 + (ch * 8), buf); return SUCCESS; } /* 2dbox position set for motion block */RETURN tw2834_cursor_select(S16 ch, S16 posx, S16 posy, S16 color, BOOL flag){ unsigned char buf[2] = { 0x00, 0x00 }; UNS16 read_reg; tw2834_read_reg(TW2834_PAGE2, 0x86 + (ch * 0x20) + (posy * 2), buf, 2); read_reg = (UNS16)((buf[0]<<8) | buf[1]); /* typecasting */ if(flag) read_reg |= (1 << posx); else read_reg &= ~(1 << posx); *(UNS16 *)buf = read_reg; /* typecasting */ tw2834_burst_write_reg(TW2834_PAGE2, 0x86 + (ch * 0x20) + (posy * 2), buf, 2); return SUCCESS; }#if 0//org codevoid tw2834_set_blink_time(S16 property){ /* set to the font blink time [5-4]bit : 00 : 0.25 sec (default) 01 : 0.5 sec 10 : 1 sec 11 : 2 sec */ tw2834_write_reg(TW2834_PAGE1, 0xa6, property & 0xf0); }#endif/* 2dbox draw */RETURN tw2834_bg_box_draw(S16 box_num, S16 draw_flag, S16 mode, S16 posx, S16 posy, S16 sizex, S16 sizey){ /* box_num : 0 ~ 15 * pos_x : 0 ~ 360, pos_y : 0 ~ 288 * size_x : 0 ~ 180( 0 ~ 720 pixel ), size_y : 0 ~ 144( 0 ~ 288 line ) */ tw2834_write_reg(TW2834_PAGE2, 0x10 + ( box_num * 5 ), (draw_flag<<7) | mode | BOX_PLNMIX | BOX_PLN_EN); if(!draw_flag) return SUCCESS; tw2834_write_reg(TW2834_PAGE2, 0x11 + ( box_num * 5 ), posx); tw2834_write_reg(TW2834_PAGE2, 0x12 + ( box_num * 5 ), sizex); tw2834_write_reg(TW2834_PAGE2, 0x13 + ( box_num * 5 ), posy); tw2834_write_reg(TW2834_PAGE2, 0x14 + ( box_num * 5 ), sizey); return SUCCESS;}RETURN tw2834_initialize(VIDEO_MODE *mode){ UNS16 ii; UNS8 data, buf;#ifdef MANUAL_VIDEO_MODE switch(*mode) { case NTSC: data = 0x00; buf = 0xc4; break; case PAL: data = 0x80; buf = 0x94; break; }#else//auto video mode /* get current mode (NTSC/PAL) */ tw2834_read_reg(TW2834_PAGE0, 0x00, &buf, 1); buf >>= 5; switch(buf) { case 0: case 1: case 2: case 3: *mode = PAL; data = 0x80; break; case 4: case 5: case 6: *mode = NTSC; data = 0x00; break; default: *mode = NTSC; data = 0x00; break; } buf <<= 4; buf |= 0x84;#endif /* set for current mode */ tw2834_write_reg(TW2834_PAGE1, 0x00, data); /* current video mode */ m_MSG("\nCurrent Video Mode = %s\n\n", *mode ? "PAL": "NTSC"); // TW2834 page 0 part init if(*mode == NTSC) { /* NTSC set */ for(ii=0; ii<4; ii++) { tw2834_burst_write_reg(TW2834_PAGE0, 0x00+0x40*ii, tbl_ntsc_page0_common, sizeof(tbl_ntsc_page0_common)); tw2834_write_reg(TW2834_PAGE0, 0x22+0x40*ii, ii); } tw2834_burst_write_reg(TW2834_PAGE0, 0x38, tbl_ntsc_page0_sfr1, sizeof(tbl_ntsc_page0_sfr1)); tw2834_burst_write_reg(TW2834_PAGE0, 0x78, tbl_ntsc_page0_sfr2, sizeof(tbl_ntsc_page0_sfr2)); tw2834_burst_write_reg(TW2834_PAGE0, 0xb8, tbl_ntsc_page0_sfr3, sizeof(tbl_ntsc_page0_sfr3)); tw2834_burst_write_reg(TW2834_PAGE0, 0xf8, tbl_ntsc_page0_sfr4, sizeof(tbl_ntsc_page0_sfr4)); } else { /* PAL set */ for(ii=0; ii<4; ii++) { tw2834_burst_write_reg(TW2834_PAGE0, 0x00+0x40*ii, tbl_pal_page0_common, sizeof(tbl_pal_page0_common)); tw2834_write_reg(TW2834_PAGE0, 0x22+0x40*ii, ii); } tw2834_burst_write_reg(TW2834_PAGE0, 0x38, tbl_pal_page0_sfr1, sizeof(tbl_pal_page0_sfr1)); tw2834_burst_write_reg(TW2834_PAGE0, 0x78, tbl_pal_page0_sfr2, sizeof(tbl_pal_page0_sfr2)); tw2834_burst_write_reg(TW2834_PAGE0, 0xb8, tbl_pal_page0_sfr3, sizeof(tbl_pal_page0_sfr3)); tw2834_burst_write_reg(TW2834_PAGE0, 0xf8, tbl_pal_page0_sfr4, sizeof(tbl_pal_page0_sfr4)); } // TW2834 page 1 part init tw2834_burst_write_reg(TW2834_PAGE1, 0x01, tbl_page1_x_com, sizeof(tbl_page1_x_com)); tw2834_burst_write_reg(TW2834_PAGE1, 0x10, tbl_page1_x_ch_nrml, sizeof(tbl_page1_x_ch_nrml)); tw2834_burst_write_reg(TW2834_PAGE1, 0x50, tbl_page1_y_com, sizeof(tbl_page1_y_com)); tw2834_burst_write_reg(TW2834_PAGE1, 0x60, tbl_page1_y_ch_nrml_pic_quad, sizeof(tbl_page1_y_ch_nrml_pic_quad)); tw2834_burst_write_reg(TW2834_PAGE1, 0x70, tbl_page1_cas_popup, sizeof(tbl_page1_cas_popup)); if(*mode == NTSC) { /* NTSC set */ tw2834_burst_write_reg(TW2834_PAGE1, 0x30, tbl_ntsc_page1_x_pic_quad, sizeof(tbl_ntsc_page1_x_pic_quad)); tw2834_burst_write_reg(TW2834_PAGE1, 0x40, tbl_ntsc_page1_dumy, sizeof(tbl_ntsc_page1_dumy)); tw2834_burst_write_reg(TW2834_PAGE1, 0x80, tbl_ntsc_page1_enc, sizeof(tbl_ntsc_page1_enc)); } else { /* PAL set */ tw2834_burst_write_reg(TW2834_PAGE1, 0x30, tbl_pal_page1_x_pic_quad, sizeof(tbl_pal_page1_x_pic_quad)); tw2834_burst_write_reg(TW2834_PAGE1, 0x40, tbl_pal_page1_dumy, sizeof(tbl_pal_page1_dumy)); tw2834_burst_write_reg(TW2834_PAGE1, 0x80, tbl_pal_page1_enc, sizeof(tbl_pal_page1_enc)); } // Channel ID controller init tw2834_burst_write_reg(TW2834_PAGE1, 0xc0, tbl_page1_channel_id_ctrl, sizeof(tbl_page1_channel_id_ctrl)); // TW2834 page 2 part init /* motion sens&mask register initializing */ for(ii=0;ii<4;ii++){ tw2834_burst_write_reg(TW2834_PAGE2,0x80+0x20*ii,tbl_page2_motn_sens, sizeof(tbl_page2_motn_sens)); tw2834_burst_write_reg(TW2834_PAGE2,0x86+0x20*ii,tbl_page2_motn_mask, sizeof(tbl_page2_motn_mask)); } /* 2d box set for color */ tw2834_burst_write_reg(TW2834_PAGE2, 0x05, tbl_page2_2dbox_color, sizeof(tbl_page2_2dbox_color)); // Page 1: sdram clock and initialize // start initializing operation mode of SDRAM tw2834_write_reg(TW2834_PAGE1, REG_CLK_CTL, 0x81); // enable MIX ( character and bitmap mode ) tw2834_write_reg(TW2834_PAGE1,0xa5,0xff); // enable BLINK ( character and bitmap mode ) tw2834_write_reg(TW2834_PAGE1,0xa6,0xff); // OSD color init tw2834_burst_write_reg(TW2834_PAGE1,0xa7,tbl_page1_osd_color, sizeof(tbl_page1_osd_color)); // OSD user color init tw2834_burst_write_reg(TW2834_PAGE1,0xae,tbl_page1_osd_user_color, sizeof(tbl_page1_osd_user_color));// pentamicro 2006.01.11 tw2834_write_string(X_PATH, 14, 9, 0x00, 0x00, " "); tw2834_write_string(X_PATH, 14,10, 0x00, 0x00, " "); tw2834_write_string(X_PATH, 14,11, 0x00, 0x00, " "); tw2834_write_string(X_PATH, 14,12, 0x00, 0x00, " "); // Font Data Upload routine tw2834_font_upload(); // display RAM clear ( x-path and y-path ) tw2834_osd_clear(ALL_PATH); SelFont(ALL_PATH,OSD_PROP_ALL,OSD_PAGE0,OSD_EN_ODD|OSD_EN_EVEN); SetFontSpace(ALL_PATH,0,0); SetFontDelay(ALL_PATH,0,OSD_DELAY_V); /* clear to booting logo box */ tw2834_bg_box_draw(2, FALSE, 0, 0, 0, 0, 0); tw2834_bg_box_draw(3, FALSE, 0, 0, 0, 0, 0); return SUCCESS; }/* end of hw_tw2834_api.c */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -