bool dbg_hw_info_rtc(void) { lcd_setfont(FONT_SYSFIXED); while(1) { int button = get_action(CONTEXT_STD, HZ / 10); switch(button) { case ACTION_STD_NEXT: case ACTION_STD_PREV: case ACTION_STD_OK: case ACTION_STD_MENU: lcd_setfont(FONT_UI); return true; case ACTION_STD_CANCEL: lcd_setfont(FONT_UI); return false; } lcd_clear_display(); struct imx233_rtc_info_t info = imx233_rtc_get_info(); lcd_putsf(0, 0, "seconds: %lu", info.seconds); for(int i = 0; i < 6; i++) lcd_putsf(0, i + 1, "persistent%d: 0x%lx", i, info.persistent[i]); lcd_update(); yield(); } }
/** * Write to EEPROM. * * @param byte */ void write_to_EEPROM (byte menu_num, byte submenu_num, byte var_in_eeprom) { lcd_gotoxy(0, 0); lcd_putsf("Write to EEPROM "); lcd_putsf("... "); switch (menu_num) { case 1: // PID switch (submenu_num) { case 1: // Kp Kp = var_in_eeprom; break; case 2: // Ki Ki = var_in_eeprom; break; case 3: // Kd Kd = var_in_eeprom; break; } break; case 2: // Speed switch (submenu_num) { case 1: // MAX max_speed = var_in_eeprom; break; case 2: // MIN min_speed = var_in_eeprom; break; } break; } delay_ms(200); }
bool lcd_debug_screen(void) { lcd_setfont(FONT_SYSFIXED); while(1) { int button = get_action(CONTEXT_STD, HZ / 10); switch(button) { case ACTION_STD_NEXT: case ACTION_STD_PREV: case ACTION_STD_OK: case ACTION_STD_MENU: lcd_setfont(FONT_UI); return true; case ACTION_STD_CANCEL: lcd_setfont(FONT_UI); return false; } lcd_clear_display(); lcd_putsf(0, 0, "has power: %d", lcd_has_power); lcd_putsf(0, 1, "lcd kind: %d", lcd_kind); lcd_update(); yield(); } return true; }
bool dbg_hw_info_adc(void) { lcd_setfont(FONT_SYSFIXED); while(1) { int button = get_action(CONTEXT_STD, HZ / 25); switch(button) { case ACTION_STD_NEXT: case ACTION_STD_PREV: case ACTION_STD_OK: case ACTION_STD_MENU: lcd_setfont(FONT_UI); return true; case ACTION_STD_CANCEL: lcd_setfont(FONT_UI); return false; } lcd_clear_display(); /* add battery readout in mV, this it is not the direct output of a channel */ lcd_putsf(0, 0, "Battery(mV) %d", _battery_voltage()); for(unsigned i = 0; i < NUM_ADC_CHANNELS; i++) { lcd_putsf(0, i + 1, "%s %d", imx233_adc_channel_name[i], adc_read(i)); } lcd_update(); yield(); } }
bool dbg_hw_info(void) { unsigned manu, id; /* flash IDs */ int got_id; /* flag if we managed to get the flash IDs */ int oldmode; /* saved memory guard mode */ int line = 0; oldmode = system_memory_guard(MEMGUARD_NONE); /* disable memory guard */ /* get flash ROM type */ got_id = dbg_flash_id(&manu, &id, 0x5555, 0x2AAA); /* try SST, Atmel, NexFlash */ if (!got_id) got_id = dbg_flash_id(&manu, &id, 0x555, 0x2AA); /* try AMD, Macronix */ system_memory_guard(oldmode); /* re-enable memory guard */ lcd_setfont(FONT_SYSFIXED); lcd_clear_display(); lcd_puts(0, line++, "[Hardware info]"); if (got_id) lcd_putsf(0, line++, "Flash: M=%04x D=%04x", manu, id); else lcd_puts(0, line++, "Flash: M=???? D=????"); /* unknown, sorry */ #ifdef IAUDIO_X5 { struct ds2411_id id; lcd_puts(0, ++line, "Serial Number:"); got_id = ds2411_read_id(&id); if (got_id == DS2411_OK) { lcd_putsf(0, ++line, " FC=%02x", (unsigned)id.family_code); lcd_putsf(0, ++line, " ID=%02X %02X %02X %02X %02X %02X", (unsigned)id.uid[0], (unsigned)id.uid[1], (unsigned)id.uid[2], (unsigned)id.uid[3], (unsigned)id.uid[4], (unsigned)id.uid[5]); lcd_putsf(0, ++line, " CRC=%02X", (unsigned)id.crc); } else { lcd_putsf(0, ++line, "READ ERR=%d", got_id); } } #endif lcd_update(); /* wait for exit */ while (button_get_w_tmo(HZ/10) != (DEBUG_CANCEL|BUTTON_REL)); lcd_setfont(FONT_UI); return false; }
bool dbg_hw_info_pinctrl(void) { lcd_setfont(FONT_SYSFIXED); #ifdef IMX233_PINCTRL_DEBUG unsigned top_user = 0; #endif while(1) { int button = get_action(CONTEXT_STD, HZ / 10); switch(button) { case ACTION_STD_NEXT: #ifdef IMX233_PINCTRL_DEBUG top_user++; break; #endif case ACTION_STD_PREV: #ifdef IMX233_PINCTRL_DEBUG if(top_user > 0) top_user--; break; #endif case ACTION_STD_OK: case ACTION_STD_MENU: lcd_setfont(FONT_UI); return true; case ACTION_STD_CANCEL: lcd_setfont(FONT_UI); return false; } lcd_clear_display(); for(int i = 0; i < 4; i++) lcd_putsf(0, i, "DIN%d = 0x%08x", i, imx233_get_gpio_input_mask(i, 0xffffffff)); #ifdef IMX233_PINCTRL_DEBUG unsigned cur_line = 6; unsigned last_line = lcd_getheight() / font_get(lcd_getfont())->height; unsigned cur_idx = 0; for(int bank = 0; bank < 4; bank++) for(int pin = 0; pin < 32; pin++) { const char *owner = imx233_pinctrl_get_pin_use(bank, pin); if(owner == NULL) continue; if(cur_idx++ >= top_user && cur_line < last_line) lcd_putsf(0, cur_line++, "B%dP%02d %s", bank, pin, owner); } if(cur_idx < top_user) top_user = cur_idx - 1; #endif lcd_update(); yield(); } }
bool dbg_hw_info_power(void) { lcd_setfont(FONT_SYSFIXED); while(1) { int button = get_action(CONTEXT_STD, HZ / 10); switch(button) { case ACTION_STD_NEXT: case ACTION_STD_PREV: case ACTION_STD_OK: case ACTION_STD_MENU: lcd_setfont(FONT_UI); return true; case ACTION_STD_CANCEL: lcd_setfont(FONT_UI); return false; } lcd_clear_display(); struct imx233_power_info_t info = imx233_power_get_info(POWER_INFO_ALL); int line = 0; unsigned trg, bo; bool en; int linreg; char buf[16]; lcd_putsf(0, line++, "name value bo linreg"); #define DISP_REGULATOR(name) \ imx233_power_get_regulator(REGULATOR_##name, &trg, &bo); \ imx233_power_get_regulator_linreg(REGULATOR_##name, &en, &linreg); \ if(en) snprintf(buf, sizeof(buf), "%d", linreg); \ else snprintf(buf, sizeof(buf), " "); \ lcd_putsf(0, line++, "%6s %4d %4d %s", #name, trg, bo, buf); \ DISP_REGULATOR(VDDD); DISP_REGULATOR(VDDA); DISP_REGULATOR(VDDIO); DISP_REGULATOR(VDDMEM); lcd_putsf(0, line++, "DC-DC: pll: %d freq: %d", info.dcdc_sel_pllclk, info.dcdc_freqsel); lcd_putsf(0, line++, "charge: %d mA stop: %d mA", info.charge_current, info.stop_current); lcd_putsf(0, line++, "charging: %d bat_adj: %d", info.charging, info.batt_adj); lcd_putsf(0, line++, "4.2: en: %d dcdc: %d", info._4p2_enable, info._4p2_dcdc); lcd_putsf(0, line++, "4.2: cmptrip: %d dropout: %d", info._4p2_cmptrip, info._4p2_dropout); lcd_putsf(0, line++, "5V: pwd_4.2_charge: %d", info._5v_pwd_charge_4p2); lcd_putsf(0, line++, "5V: chargelim: %d mA", info._5v_charge_4p2_limit); lcd_putsf(0, line++, "5V: dcdc: %d xfer: %d", info._5v_enable_dcdc, info._5v_dcdc_xfer); lcd_putsf(0, line++, "5V: thr: %d mV use: %d cmps: %d", info._5v_vbusvalid_thr, info._5v_vbusvalid_detect, info._5v_vbus_cmps); lcd_update(); yield(); } }
// TWI Slave transmission handler // This handler is called for the first time when the // transmission from the TWI slave to the master // is about to begin, returning the number of bytes // that need to be transmitted // The second time the handler is called when the // transmission has finished // In this case it must return 0 unsigned char twi_tx_handler(bool tx_complete) { if (tx_complete==false) { // Transmission from slave to master is about to start // Return the number of bytes to transmit return sizeof(twi_tx_buffer); } // Transmission from slave to master has finished // Place code here to eventually process data from // the twi_rx_buffer, if it wasn't yet processed // in the twi_rx_handler if (received_ok) { for (j=0;j<32;j++) { sost[j] = twi_rx_buffer[j]; // действия при приеме twi_tx_buffer[j] = esost[j]; // sost[j] = 0; } } else { lcd_clear(); lcd_putsf(" ERR_receive "); } // No more bytes to send in this transaction return 0; }
void main(void) { unsigned char init_result[7],lcd_result[10]; double bss; ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x86; //initiate AD for 125kHz clock, 8 bit result and AREF pin as voltage reference. lcd_init(16); //lcd connect to port D and 16 line mode. while (1) { bss=read_adc(5); bss=bss*(3.3/256); lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("voltage is:"); ftoa(bss,2,init_result); sprintf(lcd_result,"%4s volt.",init_result); lcd_gotoxy(0,1); lcd_puts(lcd_result); delay_ms(350); } }
static void charging_display_info(bool animate) { int battv; unsigned i, ypos; static unsigned phase = 3; char buf[32]; battv = battery_voltage(); lcd_putsf(4, 1, " %d.%02dV", battv / 1000, (battv % 1000) / 10); memcpy(buf, logo_pattern, 32); /* copy logo patterns */ if (!animate) /* build the screen */ { lcd_double_height(false); lcd_puts(0, 0, "[Charging]"); for (i = 0; i < 4; i++) lcd_putc(i, 1, logo_chars[i]); } else /* animate the logo */ { for (i = 3; i < MIN(19, phase); i++) { if ((i - phase) % 5 == 0) { /* draw a "bubble" here */ ypos = (phase + i/5) % 9; /* "bounce" effect */ if (ypos > 4) ypos = 8 - ypos; buf[5 - ypos + 8 * (i/5)] |= 0x10u >> (i%5); } } phase++; }
bool dbg_hw_info_ocotp(void) { lcd_setfont(FONT_SYSFIXED); unsigned top_user = 0; while(1) { int button = get_action(CONTEXT_STD, HZ / 10); switch(button) { case ACTION_STD_NEXT: top_user++; break; case ACTION_STD_PREV: if(top_user > 0) top_user--; break; case ACTION_STD_OK: case ACTION_STD_MENU: lcd_setfont(FONT_UI); return true; case ACTION_STD_CANCEL: lcd_setfont(FONT_UI); return false; } lcd_clear_display(); unsigned cur_line = 0; unsigned last_line = lcd_getheight() / font_get(lcd_getfont())->height; unsigned i = 0; for(i = 0; i < ARRAYLEN(dbg_ocotp); i++) { if(i >= top_user && cur_line < last_line) { lcd_putsf(0, cur_line, "%s", dbg_ocotp[i].name); lcd_putsf(8, cur_line++, "%x", imx233_ocotp_read(dbg_ocotp[i].addr)); } } if(i < top_user) top_user = i - 1; lcd_update(); yield(); } }
static void sig_handler(int sig, siginfo_t *siginfo, void *context) { /* safe guard variable - we call backtrace() only on first * UIE call. This prevent endless loop if backtrace() touches * memory regions which cause abort */ static bool triggered = false; lcd_set_backdrop(NULL); lcd_set_drawmode(DRMODE_SOLID); lcd_set_foreground(LCD_BLACK); lcd_set_background(LCD_WHITE); unsigned line = 0; lcd_setfont(FONT_SYSFIXED); lcd_set_viewport(NULL); lcd_clear_display(); /* get context info */ ucontext_t *uc = (ucontext_t *)context; unsigned long pc = uc->uc_mcontext.pc; unsigned long sp = uc->uc_mcontext.gregs[29]; lcd_putsf(0, line++, "%s at %08x", strsignal(sig), pc); if(sig == SIGILL || sig == SIGFPE || sig == SIGSEGV || sig == SIGBUS || sig == SIGTRAP) lcd_putsf(0, line++, "address 0x%08x", siginfo->si_addr); if(!triggered) { triggered = true; rb_backtrace(pc, sp, &line); } #ifdef ROCKBOX_HAS_LOGF lcd_putsf(0, line++, "logf:"); logf_panic_dump(&line); #endif lcd_update(); system_exception_wait(); /* If this returns, try to reboot */ system_reboot(); while (1); /* halt */ }
static void init_tagcache(void) { bool clear = false; #if CONFIG_CODEC == SWCODEC long talked_tick = 0; #endif tagcache_init(); while (!tagcache_is_initialized()) { int ret = tagcache_get_commit_step(); if (ret > 0) { #if CONFIG_CODEC == SWCODEC /* hwcodec can't use voice here, as the database commit * uses the audio buffer. */ if(global_settings.talk_menu && (talked_tick == 0 || TIME_AFTER(current_tick, talked_tick+7*HZ))) { talked_tick = current_tick; talk_id(LANG_TAGCACHE_INIT, false); talk_number(ret, true); talk_id(VOICE_OF, true); talk_number(tagcache_get_max_commit_step(), true); } #endif #ifdef HAVE_LCD_BITMAP if (lang_is_rtl()) { splashf(0, "[%d/%d] %s", ret, tagcache_get_max_commit_step(), str(LANG_TAGCACHE_INIT)); } else { splashf(0, "%s [%d/%d]", str(LANG_TAGCACHE_INIT), ret, tagcache_get_max_commit_step()); } #else lcd_double_height(false); lcd_putsf(0, 1, " DB [%d/%d]", ret, tagcache_get_max_commit_step()); lcd_update(); #endif clear = true; } sleep(HZ/4); } tagtree_init(); if (clear) { backlight_on(); show_logo(); } }
void main(void) { int i=0; char lcd_result[10]; unsigned char port_st[4]={0x0E,0x0D,0x0B,0x07}; // Port C initialization // Func7=In Func6=In Func5=In Func4=In Func3=out Func2=Out Func1=Out Func0=Out // State7=T State6=P State5=P State4=P State3=1 State2=1 State1=1 State0=1 PORTC=0x7F; DDRC=0x0F; //pins(0,1,2) defined as output with 1 value and pins(3,4,5,6) defined in with pull up. lcd_init(16); //initiate lcd. lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("Press Any Key:"); while (1) { row=0; column=0; for(i=0;i<4;i++) //3 is column in 4*3 matrix key.(3 is less) { PORTC=((PORTC & 0xF0)| port_st[i]); col_condition(i); delay_ms(20); }//end of for. if(row!=0) { lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("Last COL & ROW:"); lcd_gotoxy(0,1); sprintf(lcd_result,"%1d AND %1d",column,row); lcd_puts(lcd_result); delay_ms(50); } }//while(1) }
bool dbg_hw_info_icoll(void) { lcd_setfont(FONT_SYSFIXED); int first_irq = 0; int dbg_irqs_count = sizeof(dbg_irqs) / sizeof(dbg_irqs[0]); int line_count = lcd_getheight() / font_get(lcd_getfont())->height; while(1) { int button = get_action(CONTEXT_STD, HZ / 10); switch(button) { case ACTION_STD_NEXT: first_irq++; if(first_irq >= dbg_irqs_count) first_irq = dbg_irqs_count - 1; break; case ACTION_STD_PREV: first_irq--; if(first_irq < 0) first_irq = 0; break; case ACTION_STD_OK: case ACTION_STD_MENU: lcd_setfont(FONT_UI); return true; case ACTION_STD_CANCEL: lcd_setfont(FONT_UI); return false; } lcd_clear_display(); for(int i = first_irq, j = 0; i < dbg_irqs_count && j < line_count; i++, j++) { struct imx233_icoll_irq_info_t info = imx233_icoll_get_irq_info(dbg_irqs[i].src); lcd_putsf(0, j, "%s", dbg_irqs[i].name); if(info.enabled) lcd_putsf(10, j, "%d", info.freq); } lcd_update(); yield(); } }
void backtrace(int pcAddr, int spAddr, unsigned *line) { UnwResult r; lcd_putsf(0, (*line)++, "pc:%08x sp:%08x", pcAddr, spAddr); lcd_update(); r = UnwindStart(pcAddr, spAddr, &cliCallbacks, (void *)line); lcd_puts(0, (*line)++, "bt end"); lcd_update(); }
bool dbg_hw_info(void) { int line = 0, i, button, oldline; bool done=false; lcd_setfont(FONT_SYSFIXED); lcd_clear_display(); /* Put all the static text before the while loop */ lcd_puts(0, line++, "[Hardware info]"); line++; oldline=line; while(!done) { line = oldline; button = button_get(false); button &= ~BUTTON_REPEAT; #ifdef BUTTON_SELECT if (button == BUTTON_SELECT) #else if (button == BUTTON_STOP) #endif done=true; lcd_putsf(0, line++, "current tick: %08lx Seconds running: %08ld", current_tick, current_tick/HZ); lcd_putsf(0, line++, "GPIOA: 0x%08lx GPIOB: 0x%08lx", GPIOA, GPIOB); lcd_putsf(0, line++, "GPIOC: 0x%08lx GPIOD: 0x%08lx", GPIOC, GPIOD); lcd_putsf(0, line++, "GPIOE: 0x%08lx", GPIOE); for (i = 0; i<4; i++) lcd_putsf(0, line++, "ADC%d: 0x%04x", i, adc_read(i)); lcd_update(); } return false; }
/*************************************************************************** * * Function: CliReport * * Parameters: data - Pointer to data passed to UnwindStart() * address - The return address of a stack frame. * * Returns: TRUE if unwinding should continue, otherwise FALSE to * indicate that unwinding should stop. * * Description: This function is called from the unwinder each time a stack * frame has been unwound. The LSB of address indicates if * the processor is in ARM mode (LSB clear) or Thumb (LSB * set). * ***************************************************************************/ static Boolean CliReport(void *data, Int32 address) { /* CliStack *s = (CliStack *)data; */ unsigned *line = (unsigned *)data; lcd_putsf(0, (*line)++, " %c: %08x", (address & 0x1) ? 'T' : 'A', address & (~0x1)); lcd_update(); return TRUE; }
bool dbg_hw_info_powermgmt(void) { lcd_setfont(FONT_SYSFIXED); while(1) { int button = get_action(CONTEXT_STD, HZ / 10); switch(button) { case ACTION_STD_NEXT: case ACTION_STD_PREV: case ACTION_STD_OK: case ACTION_STD_MENU: lcd_setfont(FONT_UI); return true; case ACTION_STD_CANCEL: lcd_setfont(FONT_UI); return false; } lcd_clear_display(); struct imx233_powermgmt_info_t info = imx233_powermgmt_get_info(); lcd_putsf(0, 0, "state: %s", info.state == CHARGE_STATE_DISABLED ? "disabled" : info.state == CHARGE_STATE_ERROR ? "error" : info.state == DISCHARGING ? "discharging" : info.state == TRICKLE ? "trickle" : info.state == TOPOFF ? "topoff" : info.state == CHARGING ? "charging" : "<unknown>"); lcd_putsf(0, 1, "charging tmo: %d", info.charging_timeout); lcd_putsf(0, 2, "topoff tmo: %d", info.topoff_timeout); lcd_putsf(0, 3, "4p2ilimit tmo: %d", info.incr_4p2_ilimit_timeout); lcd_update(); yield(); } }
bool dbg_hw_info_dma(void) { lcd_setfont(FONT_SYSFIXED); while(1) { int button = get_action(CONTEXT_STD, HZ / 25); switch(button) { case ACTION_STD_NEXT: case ACTION_STD_PREV: case ACTION_STD_OK: case ACTION_STD_MENU: lcd_setfont(FONT_UI); return true; case ACTION_STD_CANCEL: lcd_setfont(FONT_UI); return false; } lcd_clear_display(); lcd_putsf(0, 0, "S C name bar apb ahb una"); for(unsigned i = 0; i < ARRAYLEN(dbg_channels); i++) { struct imx233_dma_info_t info = imx233_dma_get_info(dbg_channels[i].chan, DMA_INFO_ALL); lcd_putsf(0, i + 1, "%c %c %4s %8x %3x %3x %3x", info.gated ? 'g' : info.freezed ? 'f' : ' ', !info.int_enabled ? '-' : info.int_error ? 'e' : info.int_cmdcomplt ? 'c' : ' ', dbg_channels[i].name, info.bar, info.apb_bytes, info.ahb_bytes, info.nr_unaligned); } lcd_update(); yield(); } }
void logf_panic_dump(int *y) { int i; /* nothing to print ? */ if(logfindex == 0 && !logfwrap) { lcd_puts(1, (*y)++, "no logf data"); lcd_update(); return; } lcd_puts(1, (*y)++, "start of logf data"); lcd_update(); i = logfindex - 2; /* The last actual characer (i.e. not '\0') */ while(i >= 0) { while(logfbuffer[i] != 0 && i>=0) { i--; } if(strlen( &logfbuffer[i + 1]) > 0) { lcd_puts(1, (*y)++, &logfbuffer[i + 1]); lcd_update(); } i--; } if(logfwrap) { i = MAX_LOGF_SIZE - 1; while(i >= logfindex) { while(logfbuffer[i] != 0 && i >= logfindex) { i--; } if(strlen( &logfbuffer[i + 1]) > 0) { lcd_putsf(1, (*y)++, "%*s", (MAX_LOGF_SIZE-i) &logfbuffer[i + 1]); lcd_update(); } } i--; } lcd_puts(1, (*y)++, "end of logf data"); lcd_update(); }
bool dbg_hw_info_dcp(void) { lcd_setfont(FONT_SYSFIXED); while(1) { int button = get_action(CONTEXT_STD, HZ / 10); switch(button) { case ACTION_STD_NEXT: case ACTION_STD_PREV: case ACTION_STD_OK: case ACTION_STD_MENU: lcd_setfont(FONT_UI); return true; case ACTION_STD_CANCEL: lcd_setfont(FONT_UI); return false; } lcd_clear_display(); struct imx233_dcp_info_t info = imx233_dcp_get_info(DCP_INFO_ALL); lcd_putsf(0, 0, "crypto: %d csc: %d", info.has_crypto, info.has_csc); lcd_putsf(0, 1, "keys: %d channels: %d", info.num_keys, info.num_channels); lcd_putsf(0, 2, "ciphers: 0x%lx hash: 0x%lx", info.ciphers, info.hashs); lcd_putsf(0, 3, "gather wr: %d otp rdy: %d ch0merged: %d", info.gather_writes, info.otp_key_ready, info.ch0_merged); lcd_putsf(0, 4, "ctx switching: %d caching: %d", info.context_switching, info.context_caching); lcd_putsf(0, 5, "ch irq ien en rdy pri sem cmdptr a"); int nr = HW_DCP_NUM_CHANNELS; for(int i = 0; i < nr; i++) { lcd_putsf(0, 6 + i, "%d %d %d %d %d %d %d 0x%08lx %d", i, info.channel[i].irq, info.channel[i].irq_en, info.channel[i].enable, info.channel[i].ready, info.channel[i].high_priority, info.channel[i].sema, info.channel[i].cmdptr, info.channel[i].acquired); } lcd_putsf(0, 6 + nr, "csc %d %d %d %d", info.csc.irq, info.csc.irq_en, info.csc.enable, info.csc.priority); lcd_update(); yield(); } }
bool dbg_hw_info(void) { int line = 0, i, oldline; lcd_setfont(FONT_SYSFIXED); lcd_clear_display(); /* Put all the static text before the while loop */ lcd_puts(0, line++, "[Hardware info]"); line++; oldline=line; while (1) { line = oldline; if (button_get_w_tmo(HZ/20) == (BUTTON_POWER|BUTTON_REL)) break; lcd_putsf(0, line++, "current tick: %08lx Seconds running: %08ld", current_tick, current_tick/HZ); lcd_putsf(0, line++, "GPIOA: 0x%08lx GPIOB: 0x%08lx", GPIOA, GPIOB); lcd_putsf(0, line++, "GPIOC: 0x%08lx GPIOD: 0x%08lx", GPIOC, GPIOD); lcd_putsf(0, line++, "GPIOE: 0x%08lx", GPIOE); for (i = 0; i<4; i++) lcd_putsf(0, line++, "ADC%d: 0x%04x", i, adc_read(i)); lcd_putsf(0, line++, "STS: 0x%08lx SRC: 0x%08lx", STS, SRC); lcd_update(); } return false; }
void button_debug_screen(void) { char product_id[RMI_PRODUCT_ID_LEN]; rmi_read(RMI_PRODUCT_ID, RMI_PRODUCT_ID_LEN, product_id); int x_max = rmi_read_single(RMI_2D_SENSOR_XMAX_MSB(0)) << 8 | rmi_read_single(RMI_2D_SENSOR_XMAX_LSB(0)); int y_max = rmi_read_single(RMI_2D_SENSOR_YMAX_MSB(0)) << 8 | rmi_read_single(RMI_2D_SENSOR_YMAX_LSB(0)); int func_presence = rmi_read_single(RMI_FUNCTION_PRESENCE(RMI_2D_TOUCHPAD_FUNCTION)); int sensor_prop = rmi_read_single(RMI_2D_SENSOR_PROP2(0)); int sensor_resol = rmi_read_single(RMI_2D_SENSOR_RESOLUTION(0)); int min_dist = rmi_read_single(RMI_2D_MIN_DIST); int gesture_settings = rmi_read_single(RMI_2D_GESTURE_SETTINGS); union { unsigned char data; signed char value; }sensitivity; rmi_read(RMI_2D_SENSITIVITY_ADJ, 1, &sensitivity.data); /* Device to screen */ int zone_w = LCD_WIDTH; int zone_h = (zone_w * y_max + x_max - 1) / x_max; int zone_x = 0; int zone_y = LCD_HEIGHT - zone_h; #define DX2SX(x) (((x) * zone_w ) / x_max) #define DY2SY(y) (zone_h - ((y) * zone_h ) / y_max) struct viewport report_vp; memset(&report_vp, 0, sizeof(report_vp)); report_vp.x = zone_x; report_vp.y = zone_y; report_vp.width = zone_w; report_vp.height = zone_h; struct viewport gesture_vp; memset(&gesture_vp, 0, sizeof(gesture_vp)); gesture_vp.x = 0; gesture_vp.y = zone_y - 80; gesture_vp.width = LCD_WIDTH; gesture_vp.height = 80; while(1) { lcd_set_viewport(NULL); lcd_clear_display(); int btns = button_read_device(); lcd_putsf(0, 0, "button bitmap: %x", btns); lcd_putsf(0, 1, "RMI: id=%s p=%x s=%x", product_id, func_presence, sensor_prop); lcd_putsf(0, 2, "xmax=%d ymax=%d res=%d", x_max, y_max, sensor_resol); lcd_putsf(0, 3, "attn=%d ctl=%x int=%x", imx233_get_gpio_input_mask(0, 0x08000000) ? 0 : 1, rmi_read_single(RMI_DEVICE_CONTROL), rmi_read_single(RMI_INTERRUPT_REQUEST)); lcd_putsf(0, 4, "sensi: %d min_dist: %d", (int)sensitivity.value, min_dist); lcd_putsf(0, 5, "gesture: %x", gesture_settings); union { unsigned char data[10]; struct { struct rmi_2d_absolute_data_t absolute; struct rmi_2d_relative_data_t relative; struct rmi_2d_gesture_data_t gesture; }s; }u; int absolute_x = u.s.absolute.x_msb << 8 | u.s.absolute.x_lsb; int absolute_y = u.s.absolute.y_msb << 8 | u.s.absolute.y_lsb; int nr_fingers = u.s.absolute.misc & 7; bool gesture = (u.s.absolute.misc & 8) == 8; int palm_width = u.s.absolute.misc >> 4; rmi_read(RMI_DATA_REGISTER(0), 10, u.data); lcd_putsf(0, 6, "abs: %d %d %d", absolute_x, absolute_y, (int)u.s.absolute.z); lcd_putsf(0, 7, "rel: %d %d", (int)u.s.relative.x, (int)u.s.relative.y); lcd_putsf(0, 8, "gesture: %x %x", u.s.gesture.misc, u.s.gesture.flick); lcd_putsf(0, 9, "misc: w=%d g=%d f=%d", palm_width, gesture, nr_fingers); lcd_set_viewport(&report_vp); lcd_set_drawinfo(DRMODE_SOLID, LCD_RGBPACK(0xff, 0, 0), LCD_BLACK); lcd_drawrect(0, 0, zone_w, zone_h); if(nr_fingers == 1) { lcd_set_drawinfo(DRMODE_SOLID, LCD_RGBPACK(0, 0, 0xff), LCD_BLACK); lcd_drawline(DX2SX(absolute_x) - u.s.relative.x, DY2SY(absolute_y) + u.s.relative.y, DX2SX(absolute_x), DY2SY(absolute_y)); lcd_set_drawinfo(DRMODE_SOLID, LCD_RGBPACK(0, 0xff, 0), LCD_BLACK); lcd_fillrect(DX2SX(absolute_x) - 1, DY2SY(absolute_y) - 1, 3, 3); } lcd_set_viewport(&gesture_vp); lcd_set_drawinfo(DRMODE_SOLID, LCD_RGBPACK(0xff, 0xff, 0), LCD_BLACK); if(u.s.gesture.misc & RMI_2D_GEST_MISC_CONFIRMED) { switch(u.s.gesture.misc & RMI_2D_GEST_MISC_TAP_CODE_BM) { case RMI_2D_GEST_MISC_NO_TAP: break; case RMI_2D_GEST_MISC_SINGLE_TAP: lcd_putsf(0, 0, "TAP!"); break; case RMI_2D_GEST_MISC_DOUBLE_TAP: lcd_putsf(0, 0, "DOUBLE TAP!"); break; case RMI_2D_GEST_MISC_TAP_AND_HOLD: lcd_putsf(0, 0, "TAP & HOLD!"); break; default: break; } if(u.s.gesture.misc & RMI_2D_GEST_MISC_FLICK) { lcd_putsf(0, 1, "FLICK!"); int flick_x = u.s.gesture.flick & RMI_2D_GEST_FLICK_X_BM; int flick_y = (u.s.gesture.flick & RMI_2D_GEST_FLICK_Y_BM) >> RMI_2D_GEST_FLICK_Y_BP; #define SIGN4EXT(a) \ if(a & 8) a = -((a ^ 0xf) + 1); SIGN4EXT(flick_x); SIGN4EXT(flick_y); int center_x = (LCD_WIDTH * 2) / 3; int center_y = 40; lcd_drawline(center_x, center_y, center_x + flick_x * 5, center_y - flick_y * 5); } } lcd_update(); if(btns & BUTTON_POWER) break; if(btns & BUTTON_VOL_DOWN || btns & BUTTON_VOL_UP) { if(btns & BUTTON_VOL_UP) sensitivity.value++; if(btns & BUTTON_VOL_DOWN) sensitivity.value--; rmi_write(RMI_2D_SENSITIVITY_ADJ, 1, &sensitivity.data); } yield(); }
static void charging_display_info(bool animate) { unsigned char charging_logo[36]; const int pox_x = (LCD_WIDTH - sizeof(charging_logo)) / 2; const int pox_y = 32; static unsigned phase = 3; unsigned i; #ifdef NEED_ATA_POWER_BATT_MEASURE if (ide_powered()) /* FM and V2 can only measure when ATA power is on */ #endif { int battv = battery_voltage(); lcd_putsf(0, 7, " Batt: %d.%02dV %d%% ", battv / 1000, (battv % 1000) / 10, battery_level()); } #ifdef ARCHOS_RECORDER lcd_puts(0, 2, "Charge mode:"); const char *s; if (charge_state == CHARGING) s = str(LANG_BATTERY_CHARGE); else if (charge_state == TOPOFF) s = str(LANG_BATTERY_TOPOFF_CHARGE); else if (charge_state == TRICKLE) s = str(LANG_BATTERY_TRICKLE_CHARGE); else s = "not charging"; lcd_puts(0, 3, s); if (!charger_enabled()) animate = false; #endif /* ARCHOS_RECORDER */ /* middle part */ memset(charging_logo+3, 0x00, 32); charging_logo[0] = 0x3C; charging_logo[1] = 0x24; charging_logo[2] = charging_logo[35] = 0xFF; if (!animate) { /* draw the outline */ /* middle part */ lcd_mono_bitmap(charging_logo, pox_x, pox_y + 8, sizeof(charging_logo), 8); lcd_set_drawmode(DRMODE_FG); /* upper line */ charging_logo[0] = charging_logo[1] = 0x00; memset(charging_logo+2, 0x80, 34); lcd_mono_bitmap(charging_logo, pox_x, pox_y, sizeof(charging_logo), 8); /* lower line */ memset(charging_logo+2, 0x01, 34); lcd_mono_bitmap(charging_logo, pox_x, pox_y + 16, sizeof(charging_logo), 8); lcd_set_drawmode(DRMODE_SOLID); } else { /* animate the middle part */ for (i = 3; i<MIN(sizeof(charging_logo)-1, phase); i++) { if ((i-phase) % 8 == 0) { /* draw a "bubble" here */ unsigned bitpos; bitpos = (phase + i/8) % 15; /* "bounce" effect */ if (bitpos > 7) bitpos = 14 - bitpos; charging_logo[i] = BIT_N(bitpos); } } lcd_mono_bitmap(charging_logo, pox_x, pox_y + 8, sizeof(charging_logo), 8); phase++; } lcd_update(); }
void main(void) { // Declare your local variables here unsigned char n; // Interrupt system initialization // Optimize for speed #pragma optsize- // Make sure the interrupts are disabled #asm("cli") // Low level interrupt: Off // Round-robin scheduling for low level interrupt: Off // Medium level interrupt: Off // High level interrupt: On // The interrupt vectors will be placed at the start of the Application FLASH section n=(PMIC.CTRL & (~(PMIC_RREN_bm | PMIC_IVSEL_bm | PMIC_HILVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_LOLVLEN_bm))) | PMIC_HILVLEN_bm; CCP=CCP_IOREG_gc; PMIC.CTRL=n; // Set the default priority for round-robin scheduling PMIC.INTPRI=0x00; // Restore optimization for size if needed #pragma optsize_default // System clocks initialization system_clocks_init(); // Ports initialization ports_init(); // Virtual Ports initialization vports_init(); // USARTE0 initialization usarte0_init(); // USARTE1 initialization usarte1_init(); // USARTF0 initialization usartf0_init(); // Alphanumeric LCD initialization // Connections specified in the // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu: // RS - PORTD Bit 0 // RD - PORTD Bit 1 // EN - PORTD Bit 2 // D4 - PORTD Bit 4 // D5 - PORTD Bit 5 // D6 - PORTD Bit 6 // D7 - PORTD Bit 7 // Characters/line: 16 lcd_init(16); // Globally enable interrupts #asm("sei") a1=255; PORTB.OUT = a1 ; lcd_putsf("START"); delay_ms(2000); lcd_clear(); printf("START\n"); PORTB.OUT = 0 ; delay_ms(1000); /* PORTF.OUTCLR = 0b00010000; PORTB.OUTCLR = 0b10000000; delay_ms(100); PORTF.OUTSET = 0b00010000; PORTB.OUTSET = 0b10000000; delay_ms(100); PORTF.OUTCLR = 0b00010000; PORTB.OUTCLR = 0b10000000; delay_ms(500); */ PORTF.OUTSET = 0b00010000; PORTB.OUTSET = 0b10000000; delay_ms(1000); PORTF.OUTCLR = 0b00010000; PORTB.OUTCLR = 0b10000000; delay_ms(1000); putchar_usarte1('A'); putchar_usarte1('T'); //putchar_usarte1('I'); putchar_usarte1('\r'); //putchar_usartf0('A'); //putchar_usartf0('T'); //putchar_usartf0('I'); //putchar_usartf0('\r'); while (1) { // Place your code here PORTB.OUTTGL = 1; PORTB.OUTSET = (PORTF.IN & 0b00100000) << 1; PORTB.OUTCLR =!(PORTF.IN & 0b00100000) << 1; delay_ms(100); } }
bool dbg_hw_info(void) { #ifndef HAVE_LCD_BITMAP int button; int currval = 0; #else int bitmask = HW_MASK; #endif int rom_version = ROM_VERSION; unsigned manu, id; /* flash IDs */ bool got_id; /* flag if we managed to get the flash IDs */ unsigned rom_crc = 0xffffffff; /* CRC32 of the boot ROM */ bool has_bootrom; /* flag for boot ROM present */ int oldmode; /* saved memory guard mode */ oldmode = system_memory_guard(MEMGUARD_NONE); /* disable memory guard */ /* get flash ROM type */ got_id = dbg_flash_id(&manu, &id, 0x5555, 0x2AAA); /* try SST, Atmel, NexFlash */ if (!got_id) got_id = dbg_flash_id(&manu, &id, 0x555, 0x2AA); /* try AMD, Macronix */ /* check if the boot ROM area is a flash mirror */ has_bootrom = (memcmp((char*)0, (char*)0x02000000, 64*1024) != 0); if (has_bootrom) /* if ROM and Flash different */ { /* calculate CRC16 checksum of boot ROM */ rom_crc = crc_32((unsigned char*)0x0000, 64*1024, 0xffffffff); } system_memory_guard(oldmode); /* re-enable memory guard */ lcd_clear_display(); #ifdef HAVE_LCD_BITMAP lcd_setfont(FONT_SYSFIXED); lcd_puts(0, 0, "[Hardware info]"); lcd_putsf(0, 1, "ROM: %d.%02d", rom_version/100, rom_version%100); lcd_putsf(0, 2, "Mask: 0x%04x", bitmask); if (got_id) lcd_putsf(0, 3, "Flash: M=%02x D=%02x", manu, id); else lcd_puts(0, 3, "Flash: M=?? D=??"); /* unknown, sorry */ if (has_bootrom) { if (rom_crc == 0x56DBA4EE) /* known Version 1 */ lcd_puts(0, 4, "Boot ROM: V1"); else lcd_putsf(0, 4, "ROMcrc: 0x%08x", rom_crc); } else { lcd_puts(0, 4, "Boot ROM: none"); } lcd_update(); /* wait for exit */ while (button_get_w_tmo(HZ/10) != (DEBUG_CANCEL|BUTTON_REL)); lcd_setfont(FONT_UI); #else /* !HAVE_LCD_BITMAP */ lcd_puts(0, 0, "[HW Info]"); while(1) { switch(currval) { case 0: lcd_putsf(0, 1, "ROM: %d.%02d", rom_version/100, rom_version%100); break; case 1: if (got_id) lcd_putsf(0, 1, "Flash:%02x,%02x", manu, id); else lcd_puts(0, 1, "Flash:??,??"); /* unknown, sorry */ break; case 2: if (has_bootrom) { if (rom_crc == 0x56DBA4EE) /* known Version 1 */ lcd_puts(0, 1, "BootROM: V1"); else if (rom_crc == 0x358099E8) lcd_puts(0, 1, "BootROM: V2"); /* alternative boot ROM found in one single player so far */ else lcd_putsf(0, 1, "R: %08x", rom_crc); } else lcd_puts(0, 1, "BootROM: no"); } lcd_update(); button = button_get_w_tmo(HZ/10); switch(button) { case BUTTON_STOP: return false; case BUTTON_LEFT: currval--; if(currval < 0) currval = 2; break; case BUTTON_RIGHT: currval++; if(currval > 2) currval = 0; break; } } #endif return false; }
bool dbg_ports(void) { int adc_battery_voltage; #ifndef HAVE_LCD_BITMAP int currval = 0; int button; #else int adc_battery_level; lcd_setfont(FONT_SYSFIXED); #endif lcd_clear_display(); while(1) { #ifdef HAVE_LCD_BITMAP lcd_putsf(0, 0, "PADR: %04x", (unsigned short)PADR); lcd_putsf(0, 1, "PBDR: %04x", (unsigned short)PBDR); lcd_putsf(0, 2, "AN0: %03x AN4: %03x", adc_read(0), adc_read(4)); lcd_putsf(0, 3, "AN1: %03x AN5: %03x", adc_read(1), adc_read(5)); lcd_putsf(0, 4, "AN2: %03x AN6: %03x", adc_read(2), adc_read(6)); lcd_putsf(0, 5, "AN3: %03x AN7: %03x", adc_read(3), adc_read(7)); battery_read_info(&adc_battery_voltage, &adc_battery_level); lcd_putsf(0, 6, "Batt: %d.%03dV %d%% ", adc_battery_voltage / 1000, adc_battery_voltage % 1000, adc_battery_level); lcd_update(); while (button_get_w_tmo(HZ/10) != (DEBUG_CANCEL|BUTTON_REL)); lcd_setfont(FONT_UI); #else /* !HAVE_LCD_BITMAP */ if (currval == 0) { lcd_putsf(0, 0, "PADR: %04x", (unsigned short)PADR); } else if (currval == 1) { lcd_putsf(0, 0, "PBDR: %04x", (unsigned short)PBDR); } else { int idx = currval - 2; /* idx < 7 */ lcd_putsf(0, 0, "AN%d: %03x", idx, adc_read(idx)); } battery_read_info(&adc_battery_voltage, NULL); lcd_putsf(0, 1, "Batt: %d.%03dV", adc_battery_voltage / 1000, adc_battery_voltage % 1000); lcd_update(); button = button_get_w_tmo(HZ/5); switch(button) { case BUTTON_STOP: return false; case BUTTON_LEFT: currval--; if(currval < 0) currval = 9; break; case BUTTON_RIGHT: currval++; if(currval > 9) currval = 0; break; } #endif } return false; }
bool dbg_ports(void) { unsigned int gpio_out; unsigned int gpio1_out; unsigned int gpio_read; unsigned int gpio1_read; unsigned int gpio_function; unsigned int gpio1_function; unsigned int gpio_enable; unsigned int gpio1_enable; int adc_battery_voltage, adc_battery_level; int adc_buttons, adc_remote; int line; lcd_clear_display(); lcd_setfont(FONT_SYSFIXED); while(1) { line = 0; gpio_read = GPIO_READ; gpio1_read = GPIO1_READ; gpio_out = GPIO_OUT; gpio1_out = GPIO1_OUT; gpio_function = GPIO_FUNCTION; gpio1_function = GPIO1_FUNCTION; gpio_enable = GPIO_ENABLE; gpio1_enable = GPIO1_ENABLE; lcd_putsf(0, line++, "GPIO_READ: %08x", gpio_read); lcd_putsf(0, line++, "GPIO_OUT: %08x", gpio_out); lcd_putsf(0, line++, "GPIO_FUNC: %08x", gpio_function); lcd_putsf(0, line++, "GPIO_ENA: %08x", gpio_enable); lcd_putsf(0, line++, "GPIO1_READ: %08x", gpio1_read); lcd_putsf(0, line++, "GPIO1_OUT: %08x", gpio1_out); lcd_putsf(0, line++, "GPIO1_FUNC: %08x", gpio1_function); lcd_putsf(0, line++, "GPIO1_ENA: %08x", gpio1_enable); adc_buttons = adc_read(ADC_BUTTONS); adc_remote = adc_read(ADC_REMOTE); battery_read_info(&adc_battery_voltage, &adc_battery_level); #if defined(IAUDIO_X5) || defined(IAUDIO_M5) || defined(IRIVER_H300_SERIES) lcd_putsf(0, line++, "ADC_BUTTONS (%c): %02x", button_scan_enabled() ? '+' : '-', adc_buttons); #else lcd_putsf(0, line++, "ADC_BUTTONS: %02x", adc_buttons); #endif #if defined(IAUDIO_X5) || defined(IAUDIO_M5) lcd_putsf(0, line++, "ADC_REMOTE (%c): %02x", remote_detect() ? '+' : '-', adc_remote); #else lcd_putsf(0, line++, "ADC_REMOTE: %02x", adc_remote); #endif #if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES) lcd_putsf(0, line++, "ADC_REMOTEDETECT: %02x", adc_read(ADC_REMOTEDETECT)); #endif battery_read_info(&adc_battery_voltage, &adc_battery_level); lcd_putsf(0, line++, "Batt: %d.%03dV %d%% ", adc_battery_voltage / 1000, adc_battery_voltage % 1000, adc_battery_level); #if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES) lcd_putsf(0, line++, "remotetype: %d", remote_type()); #endif lcd_update(); if (button_get_w_tmo(HZ/10) == (DEBUG_CANCEL|BUTTON_REL)) { lcd_setfont(FONT_UI); return false; } } return false; }
bool dbg_hw_info_clkctrl(void) { lcd_setfont(FONT_SYSFIXED); while(1) { int button = get_action(CONTEXT_STD, HZ / 10); switch(button) { case ACTION_STD_NEXT: case ACTION_STD_PREV: case ACTION_STD_OK: case ACTION_STD_MENU: lcd_setfont(FONT_UI); return true; case ACTION_STD_CANCEL: lcd_setfont(FONT_UI); return false; } lcd_clear_display(); /* 012345678901234567890123456789 */ lcd_putsf(0, 0, "name en by idiv fdiv frequency"); for(unsigned i = 0; i < ARRAYLEN(dbg_clk); i++) { #define c dbg_clk[i] lcd_putsf(0, i + 1, "%4s", c.name); if(c.has_enable) lcd_putsf(5, i + 1, "%2d", imx233_clkctrl_is_clock_enabled(c.clk)); if(c.has_bypass) lcd_putsf(8, i + 1, "%2d", imx233_clkctrl_get_bypass_pll(c.clk)); if(c.has_idiv && imx233_clkctrl_get_clock_divisor(c.clk) != 0) lcd_putsf(10, i + 1, "%4d", imx233_clkctrl_get_clock_divisor(c.clk)); if(c.has_fdiv && imx233_clkctrl_get_fractional_divisor(c.clk) != 0) lcd_putsf(16, i + 1, "%4d", imx233_clkctrl_get_fractional_divisor(c.clk)); if(c.has_freq) lcd_putsf(21, i + 1, "%9d", imx233_clkctrl_get_clock_freq(c.clk)); #undef c } int line = ARRAYLEN(dbg_clk) + 1; lcd_putsf(0, line, "as: %d/%d emi sync: %d", imx233_clkctrl_is_auto_slow_enabled(), 1 << imx233_clkctrl_get_auto_slow_divisor(), imx233_clkctrl_is_emi_sync_enabled()); line++; lcd_putsf(0, line, "as monitor: "); int x_off = 12; bool first = true; unsigned line_w = lcd_getwidth() / font_get_width(font_get(lcd_getfont()), ' '); for(unsigned i = 0; i < ARRAYLEN(dbg_as_monitor); i++) { if(!imx233_clkctrl_is_auto_slow_monitor_enabled(dbg_as_monitor[i].monitor)) continue; if(!first) { lcd_putsf(x_off, line, ", "); x_off += 2; } first = false; if((x_off + strlen(dbg_as_monitor[i].name)) > line_w) { x_off = 1; line++; } lcd_putsf(x_off, line, "%s", dbg_as_monitor[i].name); x_off += strlen(dbg_as_monitor[i].name); } line++; lcd_update(); yield(); } }