static __inline unsigned int spi_read_data(void) { unsigned int i; s32 inA0 = -1; UDELAY(100); SET_LSCK_HIGH; SET_LSDA_HIGH; UDELAY(100); for (i = 0; i < 9; ++ i) { SET_LSCK_LOW; /* if (data & (0x100)) { // 0x80= (1 << (9-1)) */ /* SET_LSDA_HIGH; */ /* dbg_print("~1"); */ /* } else { */ /* SET_LSDA_LOW; */ /* dbg_print("~0"); */ /* } */ UDELAY(100); inA0 = GET_LSA0_IN; //printf("`%d",inA0); SET_LSCK_HIGH; UDELAY(100); } //printf("\n"); SET_LSDA_HIGH; }
static __inline void spi_send_data(unsigned int data) { unsigned int i; SET_LSCE_HIGH; SET_LSCK_HIGH; SET_LSDA_HIGH; UDELAY(10); SET_LSCE_LOW; UDELAY(10); for (i = 0; i < 24; ++i) { if (data & (1 << 23)) { SET_LSDA_HIGH; } else { SET_LSDA_LOW; } data <<= 1; UDELAY(10); SET_LSCK_LOW; UDELAY(10); SET_LSCK_HIGH; UDELAY(10); } SET_LSDA_HIGH; SET_LSCE_HIGH; }
static void LCDSPI_GPIO_DAT(unsigned char data) { unsigned int i; SET_LSCE_LOW; UDELAY(10); SET_LSCK_LOW; SET_LSDA_HIGH; UDELAY(100); SET_LSCK_HIGH; UDELAY(100); for (i = 0; i < 8; i++ ) { SET_LSCK_LOW; if (data & 0x80) { SET_LSDA_HIGH; } else { SET_LSDA_LOW; } UDELAY(100); SET_LSCK_HIGH; UDELAY(100); data <<= 1; } SET_LSCE_HIGH; }
static __inline void spi_send_data_ICID(unsigned int data) { unsigned int i; UDELAY(100); SET_LSCK_HIGH; SET_LSDA_HIGH; UDELAY(100); for (i = 0; i < 9; ++ i) { SET_LSCK_LOW; if (data & (0x100)) { // 0x80= (1 << (9-1)) SET_LSDA_HIGH; dbg_print("~1"); } else { SET_LSDA_LOW; dbg_print("~0"); } UDELAY(100); SET_LSCK_HIGH; UDELAY(100); data <<= 1; } SET_LSDA_HIGH; }
static __inline void spi_send_data(unsigned int data) { unsigned int i; SET_LSCE_LOW; UDELAY(1); SET_LSCK_HIGH; SET_LSDA_HIGH; UDELAY(1); for (i = 0; i < 9; ++ i) { SET_LSCK_LOW; if (data & (1 << 8)) { SET_LSDA_HIGH; } else { SET_LSDA_LOW; } UDELAY(1); SET_LSCK_HIGH; UDELAY(1); data <<= 1; } SET_LSDA_HIGH; SET_LSCE_HIGH; }
static int boot_cpu(imps_processor *proc) { int apicid = proc->apic_id, success = 1, to; unsigned bootaddr, accept_status; unsigned bios_reset_vector = PHYS_TO_VIRTUAL(BIOS_RESET_VECTOR); /* * Copy boot code for secondary CPUs here. Find it in between * "patch_code_start" and "patch_code_end" symbols. The other CPUs * will start there in 16-bit real mode under the 1MB boundary. * "patch_code_start" should be placed at a 4K-aligned address * under the 1MB boundary. */ extern char patch_code_start[]; extern char patch_code_end[]; bootaddr = (512-64)*1024; memcpy((char *)bootaddr, patch_code_start, patch_code_end - patch_code_start); /* * Generic CPU startup sequence starts here. */ /* set BIOS reset vector */ CMOS_WRITE_BYTE(CMOS_RESET_CODE, CMOS_RESET_JUMP); *((volatile unsigned *) bios_reset_vector) = ((bootaddr & 0xFF000) << 12); /* clear the APIC error register */ IMPS_LAPIC_WRITE(LAPIC_ESR, 0); accept_status = IMPS_LAPIC_READ(LAPIC_ESR); /* assert INIT IPI */ send_ipi(apicid, LAPIC_ICR_TM_LEVEL | LAPIC_ICR_LEVELASSERT | LAPIC_ICR_DM_INIT); UDELAY(10000); /* de-assert INIT IPI */ send_ipi(apicid, LAPIC_ICR_TM_LEVEL | LAPIC_ICR_DM_INIT); UDELAY(10000); /* * Send Startup IPIs if not an old pre-integrated APIC. */ if (proc->apic_ver >= APIC_VER_NEW) { int i; for (i = 1; i <= 2; i++) { send_ipi(apicid, LAPIC_ICR_DM_SIPI | ((bootaddr >> 12) & 0xFF)); UDELAY(1000); } }
static unsigned char LCDSPI_Read(char cmd) { char MB; unsigned int i,j; SET_LSCE_LOW; UDELAY(10); SET_LSCK_LOW; SET_LSDA_LOW; UDELAY(10); SET_LSCK_HIGH; UDELAY(100); for (i = 0; i < 8; i++ ) { SET_LSCK_LOW; if (cmd & 0x80) { SET_LSDA_HIGH; } else { SET_LSDA_LOW; } UDELAY(100); SET_LSCK_HIGH; UDELAY(100); cmd <<= 1; } UDELAY(20); for(j=0;j<2;j++) { MB = 0x00; for(i=0;i<8;i++) { SET_LSCK_LOW; UDELAY(100); SET_LSCK_HIGH; if (1 == (mt_get_gpio_in(LSDI_GPIO_PIN))&0x1) MB |= 1 << (7 - i); UDELAY(100); } } SET_LSCE_HIGH; SET_LSCK_HIGH; SET_LSDA_HIGH; return MB; }
static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) { unsigned int i; for(i = 0; i < count; i++) { unsigned cmd; cmd = table[i].cmd; switch (cmd) { case REGFLAG_DELAY : if(table[i].count <= 10) MDELAY(table[i].count); else MDELAY(table[i].count); break; case REGFLAG_UDELAY : UDELAY(table[i].count); break; case REGFLAG_END_OF_TABLE : break; default: dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); } } }
static void lcm_resume(void) { //enable level shift in UBOOT mt_set_gpio_mode(GPIO100, GPIO_MODE_00); mt_set_gpio_dir(GPIO100, GPIO_DIR_OUT); mt_set_gpio_out(GPIO100, GPIO_OUT_ONE); MDELAY(5); mt_set_gpio_mode(GPIO66, GPIO_MODE_00); mt_set_gpio_dir(GPIO66, GPIO_DIR_OUT); mt_set_gpio_out(GPIO66, GPIO_OUT_ONE); UDELAY(400); mt_set_gpio_mode(GPIO12, GPIO_MODE_00); mt_set_gpio_dir(GPIO12, GPIO_DIR_OUT); mt_set_gpio_out(GPIO12, GPIO_OUT_ONE); // LCM_STBY MDELAY(10); mt_set_gpio_mode(GPIO49, GPIO_MODE_00); mt_set_gpio_dir(GPIO49, GPIO_DIR_OUT); mt_set_gpio_out(GPIO49, GPIO_OUT_ONE); // LCM_RST MDELAY(5); mt_set_gpio_mode(GPIO52, GPIO_MODE_00); mt_set_gpio_dir(GPIO52, GPIO_DIR_OUT); mt_set_gpio_out(GPIO52, GPIO_OUT_ONE); // LCM_VLED_EN MDELAY(5); mt_set_gpio_mode(GPIO84, GPIO_MODE_00); mt_set_gpio_dir(GPIO84, GPIO_DIR_OUT); mt_set_gpio_out(GPIO84, GPIO_OUT_ONE); // LVDS_SHUTDOWN_N MDELAY(40); mt_set_gpio_out(GPIO49, GPIO_OUT_ZERO); // LCM_RST MDELAY(1); mt_set_gpio_out(GPIO49, GPIO_OUT_ONE); // LCM_RST MDELAY(100); mt_set_gpio_mode(GPIO48, GPIO_MODE_00); mt_set_gpio_dir(GPIO48, GPIO_DIR_OUT); mt_set_gpio_out(GPIO48, GPIO_OUT_ONE); // LCM_BL_EN }
static void lcm_resume(void) { #if 1 send_ctrl_cmd(0x11); MDELAY(120); send_ctrl_cmd(0x29); MDELAY(50); #else unsigned int lcd_id = 0; SET_RESET_PIN(1); MDELAY(5); SET_RESET_PIN(0); MDELAY(20); SET_RESET_PIN(1); MDELAY(20); // 400 send_ctrl_cmd(0xB9); send_data_cmd(0xFF); send_data_cmd(0x83); send_data_cmd(0x57); UDELAY(10); lcd_id = get_lcd_id_n(LCMID_REG, 2); LCD_PRINT("[JINCHI35_HX8357C]lcm_resume: lcd_id = 0x%x\n", lcd_id); #if 0//ndef BUILD_UBOOT print_lcm_registers(); #endif init_lcm_registers(); #endif }
static void lcm_resume(void) { #if 1 send_ctrl_cmd(0x1100); MDELAY(120); send_ctrl_cmd(0x2900); MDELAY(50); #else unsigned int lcd_id = 0; SET_RESET_PIN(1); MDELAY(5); SET_RESET_PIN(0); MDELAY(50); SET_RESET_PIN(1); MDELAY(100); // 400 send_ctrl_cmd(0xF000);send_data_cmd(0x55); send_ctrl_cmd(0xF001);send_data_cmd(0xAA); send_ctrl_cmd(0xF002);send_data_cmd(0x52); send_ctrl_cmd(0xF003);send_data_cmd(0x08); send_ctrl_cmd(0xF004);send_data_cmd(0x01); UDELAY(10); lcd_id = get_lcd_id_r(LCM_ID_REG) & 0xFF; lcd_id = (lcd_id << 8) | (get_lcd_id_r(LCM_ID_REG + 1) & 0xFF); LCD_PRINT(LCM_NAME"lcm_resume: lcd_id = 0x%x\n", lcd_id); init_lcm_registers(); #endif }
static unsigned int lcm_compare_id(void) { unsigned int lcd_id = 0; SET_RESET_PIN(1); MDELAY(5); SET_RESET_PIN(0); MDELAY(50); SET_RESET_PIN(1); MDELAY(120); send_ctrl_cmd(0xF000);send_data_cmd(0x55); send_ctrl_cmd(0xF001);send_data_cmd(0xAA); send_ctrl_cmd(0xF002);send_data_cmd(0x52); send_ctrl_cmd(0xF003);send_data_cmd(0x08); send_ctrl_cmd(0xF004);send_data_cmd(0x01); UDELAY(10); lcd_id = get_lcd_id_r(LCM_ID_REG) & 0xFF; lcd_id = (lcd_id << 8) | (get_lcd_id_r(LCM_ID_REG + 1) & 0xFF); LCD_PRINT(LCM_NAME"lcm_compare_id: lcd_id = 0x%x\n", lcd_id); return (LCM_ID == lcd_id)?1:0; }
static void lcm_resume(void) { #if 1 send_ctrl_cmd(0x1100); MDELAY(120); send_ctrl_cmd(0x2900); MDELAY(50); #else unsigned int lcd_id = 0; SET_RESET_PIN(1); MDELAY(5); SET_RESET_PIN(0); MDELAY(50); SET_RESET_PIN(1); MDELAY(100); // 400 send_ctrl_cmd(0xB9); send_data_cmd(0xFF); send_data_cmd(0x83); send_data_cmd(0x63); UDELAY(10); lcd_id = get_lcd_id_n(LCM_ID_REG, 2) & 0xFF; LCD_PRINT(LCM_NAME"lcm_resume: lcd_id = 0x%x\n", lcd_id); init_lcm_registers(); #endif }
static __inline void spi_send_data(unsigned int data) { unsigned int i; for (i = 0; i < 8; ++ i) { SET_LSCK_LOW; if (data & 0x80) { SET_LSDA_HIGH; } else { SET_LSDA_LOW; } UDELAY(1); SET_LSCK_HIGH; UDELAY(1); data <<= 1; } }
static __inline unsigned char spi_get_data(unsigned int reg) { unsigned int i; int k; unsigned char getbyte=0; reg = (CTRL_ID | (reg & 0xFF)); SET_LSCE_HIGH; SET_LSCK_LOW; SET_LSDA_HIGH; UDELAY(1); SET_LSCE_LOW; UDELAY(1); for (i = 0; i < 9; i++) { SET_LSCK_LOW; if (reg & (1 << 8)) { SET_LSDA_HIGH; } else { SET_LSDA_LOW; } UDELAY(1); SET_LSCK_HIGH; UDELAY(1); reg <<= 1; } SET_LSA0_INPUT; UDELAY(2); // SET_LSCK_LOW; // UDELAY(2); // SET_LSCK_LOW; // UDELAY(2); // SET_LSCK_HIGH; // UDELAY(2); for (k = 7; k >= 0; k--) { SET_LSCK_LOW; UDELAY(1); if (GET_LSA0_BIT) { getbyte |= (1 << k); } SET_LSCK_HIGH; UDELAY(2); } SET_LSDA_OUTPUT; SET_LSDA_HIGH; SET_LSCE_HIGH; return getbyte; }
/* *It used index to indentify command or data tyep.1:data.0:cmd. */ static void spi_send(unsigned int index, unsigned int data) { unsigned int i; SET_LSCE_LOW; UDELAY(10); SET_LSCK_LOW; UDELAY(10); SET_GPIO_OUT(LSDA_GPIO_PIN, index); UDELAY(10); SET_LSCK_HIGH; for (i = 0; i < 8; i++) { if( data & 0x80 ) { SET_LSDA_HIGH; } else { SET_LSDA_LOW; } data <<= 1; UDELAY(10); SET_LSCK_LOW; UDELAY(10); SET_LSCK_HIGH; UDELAY(10); } SET_LSCE_HIGH; }
static __inline unsigned char spi_get_byte(unsigned int reg) { unsigned int i; int k; unsigned char getbyte=0; // reg = (CTRL_ID | (reg & 0xFF)); SET_LSCK_HIGH; SET_LSDA_HIGH; UDELAY(1); SET_LSCE_LOW; UDELAY(1); for (i = 0; i < 8; ++ i) { SET_LSCK_LOW; if (reg & (1 << 7)) { SET_LSDA_HIGH; } else { SET_LSDA_LOW; } UDELAY(1); SET_LSCK_HIGH; UDELAY(1); reg <<= 1; } UDELAY(2); for (k = 7; k >= 0; k--) { SET_LSCK_LOW; UDELAY(5); SET_LSCK_HIGH; UDELAY(5); if (GET_LSA0_BIT) { getbyte |= (1 << k); } } UDELAY(2); SET_LSDA_HIGH; SET_LSCE_HIGH; return getbyte; }
static __inline void send_ctrl_cmd(unsigned int cmd) { SET_LSCE_HIGH; SET_LSDA_HIGH; SET_LSCK_HIGH; SET_LSCE_LOW; UDELAY(1); SET_LSCK_LOW; SET_LSDA_LOW; UDELAY(1); SET_LSCK_HIGH; UDELAY(1); spi_send_data(cmd); SET_LSCK_HIGH; SET_LSDA_HIGH; SET_LSCE_HIGH; UDELAY(1); }
static __inline void send_data_cmd(unsigned int data) { SET_LSCE_HIGH; SET_LSDA_HIGH; SET_LSCK_HIGH; SET_LSCE_LOW; UDELAY(1); SET_LSCK_LOW; SET_LSDA_HIGH; UDELAY(1); SET_LSCK_HIGH; UDELAY(1); spi_send_data(data); SET_LSCK_HIGH; SET_LSDA_HIGH; SET_LSCE_HIGH; UDELAY(1); }
static __inline void spi_send_data(unsigned int data) { unsigned int i; int clk_num; int clk_mask; UDELAY(100); SET_LSCK_HIGH; SET_LSDA_HIGH; UDELAY(100); clk_num = 9; clk_mask = 0x100; dbg_print("\n^"); UDELAY(50); for (i = 0; i < clk_num; ++ i) { SET_LSCK_LOW; if (data & (clk_mask)) { // 0x80= (1 << (9-1)) SET_LSDA_HIGH; dbg_print("~1"); } else { SET_LSDA_LOW; dbg_print("~0"); } UDELAY(100); SET_LSCK_HIGH; UDELAY(100); data <<= 1; } dbg_print("\n"); SET_ICID_HIGH; SET_LSDA_HIGH; }
static void LCDSPI_GPIO_CMD(unsigned char cmd) { unsigned int i; SET_LSCE_LOW; UDELAY(10); SET_LSCK_LOW; SET_LSDA_LOW; UDELAY(10); SET_LSCK_HIGH; UDELAY(100); for (i = 0; i < 8; i++ ) { SET_LSCK_LOW; if (cmd & 0x80) { SET_LSDA_HIGH; } else { SET_LSDA_LOW; } UDELAY(100); SET_LSCK_HIGH; UDELAY(100); cmd <<= 1; } SET_LSCE_HIGH; }
static int send_ipi(unsigned int dst, unsigned int v) { int to, send_status; IMPS_LAPIC_WRITE(LAPIC_ICR+0x10, (dst << 24)); IMPS_LAPIC_WRITE(LAPIC_ICR, v); /* Wait for send to finish */ to = 0; do { UDELAY(100); send_status = IMPS_LAPIC_READ(LAPIC_ICR) & LAPIC_ICR_STATUS_PEND; } while (send_status && (to++ < 1000)); return (to < 1000); }
static __inline void send_ctrl_cmd(unsigned char cmd) { unsigned char i; SET_LSCE_HIGH; UDELAY(1); SET_LSCK_HIGH; UDELAY(1); SET_LSDA_HIGH; UDELAY(1); SET_LSCE_LOW; UDELAY(1); SET_LSCK_LOW; UDELAY(1); SET_LSDA_LOW;//A0=0 UDELAY(1); SET_LSCK_HIGH; UDELAY(1); for (i = 0; i < 8; ++ i) { SET_LSCK_LOW; if (cmd & (1 << 7)) { SET_LSDA_HIGH; } else { SET_LSDA_LOW; } UDELAY(1); SET_LSCK_HIGH; UDELAY(1); cmd <<= 1; } SET_LSDA_HIGH; SET_LSCE_HIGH; }
static __inline void send_data_cmd(unsigned char data) { unsigned char i; SET_LSCE_HIGH; UDELAY(1); SET_LSCK_HIGH; UDELAY(1); SET_LSDA_HIGH; UDELAY(1); SET_LSCE_LOW; UDELAY(1); SET_LSCK_LOW; UDELAY(1); SET_LSDA_HIGH;//A0=1 UDELAY(1); SET_LSCK_HIGH; UDELAY(1); for (i = 0; i < 8; ++ i) { SET_LSCK_LOW; if (data & (1 << 7)) { SET_LSDA_HIGH; } else { SET_LSDA_LOW; } UDELAY(1); SET_LSCK_HIGH; UDELAY(1); data <<= 1; } SET_LSDA_HIGH; SET_LSCE_HIGH; }
static unsigned int get_lcd_id_n(unsigned int addr, unsigned char count) { volatile unsigned int id = 0; unsigned char k = 0; send_ctrl_cmd(addr); UDELAY(10); while (k < count) { id = read_data_cmd(); k++; } LCD_PRINT("[JINCHI35_HX8357C]get_lcd_id_n: id = 0x%x\n", id); return id; }
static __inline unsigned short Read_register(void) { unsigned char i,j,front_data; unsigned short value = 0; front_data=HX_RD_REGISTER; SET_LSCE_HIGH; SET_LSCK_HIGH; SET_LSDA_HIGH; UDELAY(10); SET_LSCE_LOW; UDELAY(10); for(i=0;i<8;i++) // 8 Data { if ( front_data& 0x80) SET_LSDA_HIGH; else SET_LSDA_LOW; front_data<<= 1; UDELAY(10); SET_LSCK_LOW; UDELAY(10); SET_LSCK_HIGH; UDELAY(10); } MDELAY(1); for(j=0;j<16;j++) // 16 Data { SET_LSCK_HIGH; UDELAY(10); SET_LSCK_LOW; value<<= 1; value |= GET_HX_SDI; UDELAY(10); } SET_LSCE_HIGH; return value; }
static void lcm_init(void) { #ifdef BUILD_LK #elif (defined BUILD_UBOOT) // do nothing in uboot #else //enable level shift in UBOOT mt_set_gpio_mode(GPIO100, GPIO_MODE_00); mt_set_gpio_dir(GPIO100, GPIO_DIR_OUT); mt_set_gpio_out(GPIO100, GPIO_OUT_ONE); MDELAY(5); mt_set_gpio_mode(GPIO66, GPIO_MODE_00); mt_set_gpio_dir(GPIO66, GPIO_DIR_OUT); mt_set_gpio_out(GPIO66, GPIO_OUT_ONE); UDELAY(400); mt_set_gpio_mode(GPIO12, GPIO_MODE_00); mt_set_gpio_dir(GPIO12, GPIO_DIR_OUT); mt_set_gpio_out(GPIO12, GPIO_OUT_ONE); // LCM_STBY MDELAY(10); mt_set_gpio_mode(GPIO49, GPIO_MODE_00); mt_set_gpio_dir(GPIO49, GPIO_DIR_OUT); mt_set_gpio_out(GPIO49, GPIO_OUT_ONE); // LCM_RST MDELAY(5); mt_set_gpio_mode(GPIO52, GPIO_MODE_00); mt_set_gpio_dir(GPIO52, GPIO_DIR_OUT); mt_set_gpio_out(GPIO52, GPIO_OUT_ONE); // LCM_VLED_EN MDELAY(5); mt_set_gpio_mode(GPIO84, GPIO_MODE_00); mt_set_gpio_dir(GPIO84, GPIO_DIR_OUT); mt_set_gpio_out(GPIO84, GPIO_OUT_ONE); // LVDS_SHUTDOWN_N MDELAY(40); mt_set_gpio_out(GPIO49, GPIO_OUT_ZERO); // LCM_RST MDELAY(1); mt_set_gpio_out(GPIO49, GPIO_OUT_ONE); // LCM_RST MDELAY(100); mt_set_gpio_mode(GPIO48, GPIO_MODE_00); mt_set_gpio_dir(GPIO48, GPIO_DIR_OUT); mt_set_gpio_out(GPIO48, GPIO_OUT_ONE); // LCM_BL_EN #endif }
static unsigned int lcm_esd_check(void) { unsigned char buffer[3] = {0}; unsigned int array[3] = {0}; UDELAY(600); array[0] = 0x00063902; array[1] = 0x0698ffff; array[2] = 0x00000004; dsi_set_cmdq(array, 3, 1); //--------------------------------- // Set Maximum Return Size //--------------------------------- array[0] = 0x00013700; dsi_set_cmdq(array, 1, 1); read_reg_v2(0x0A, &buffer[0], 1); #if defined(BUILD_LK) // printf("lcm_esd_check 0x0A=%x\n",buffer[0]); #else // printk("lcm_esd_check 0x0A=%x\n",buffer[0]); #endif array[0] = 0x00063902; array[1] = 0x0698ffff; array[2] = 0x00000804; dsi_set_cmdq(array, 3, 1); if(0x9c == buffer[0]) { return FALSE; } else { return TRUE; } }
static unsigned int lcm_compare_id(void) { unsigned int lcd_id = 0x0; SET_RESET_PIN(1); MDELAY(5); SET_RESET_PIN(0); MDELAY(50); SET_RESET_PIN(1); MDELAY(120); send_ctrl_cmd(0xB9); send_data_cmd(0xFF); send_data_cmd(0x83); send_data_cmd(0x57); UDELAY(10); lcd_id = get_lcd_id_n(LCMID_REG, 2); LCD_PRINT("[JINCHI35_HX8357C]lcm_compare_id: lcd_id = 0x%x\n", lcd_id); return (LCM_ID == lcd_id)?1:0; }
static unsigned int lcm_compare_id(void) { unsigned int lcd_id = 0; SET_RESET_PIN(1); MDELAY(5); SET_RESET_PIN(0); MDELAY(50); SET_RESET_PIN(1); MDELAY(120); send_ctrl_cmd(0xB9); send_data_cmd(0xFF); send_data_cmd(0x83); send_data_cmd(0x63); UDELAY(10); lcd_id = get_lcd_id_n(LCM_ID_REG, 2) & 0xFF; LCD_PRINT(LCM_NAME"lcm_resume: lcd_id = 0x%x\n", lcd_id); return (LCM_ID == lcd_id)?1:0; }