int main(void) { char buf[22]; int len; PLLCFG = (1<<5) | (4<<0); //PLL MSEL=0x4 (+1), PSEL=0x1 (/2) so 11.0592*5 = 55.296MHz, Fcco = (2x55.296)*2 = 221MHz which is within 156 to 320MHz PLLCON = 0x01; PLLFEED = 0xaa; PLLFEED = 0x55; // Feed complete while(!(PLLSTAT & (1<<10))); // Wait for PLL to lock PLLCON = 0x03; PLLFEED = 0xaa; PLLFEED = 0x55; // Feed complete VPBDIV = 0x01; // APB runs at the same frequency as the CPU (55.296MHz) MAMTIM = 0x03; // 3 cycles flash access recommended >40MHz MAMCR = 0x02; // Fully enable memory accelerator Sched_Init(); IO_Init(); Set_Heater(0); Set_Fan(0); Serial_Init(); I2C_Init(); EEPROM_Init(); NV_Init(); if( NV_GetConfig(REFLOW_BEEP_DONE_LEN) == 255 ) { NV_SetConfig(REFLOW_BEEP_DONE_LEN, 10); // Default 1 second beep length } printf("\nInitializing improved reflow oven..."); LCD_Init(); LCD_BMPDisplay(logobmp,0,0); // Setup watchdog WDTC = PCLKFREQ / 3; // Some margin (PCLKFREQ/4 would be exactly the period the WD is fed by sleep_work) WDMOD = 0x03; // Enable WDFEED = 0xaa; WDFEED = 0x55; uint8_t resetreason = RSIR; RSIR = 0x0f; // Clear it out printf("\nReset reason(s): %s%s%s%s", (resetreason&(1<<0))?"[POR]":"", (resetreason&(1<<1))?"[EXTR]":"", (resetreason&(1<<2))?"[WDTR]":"", (resetreason&(1<<3))?"[BODR]":""); // Request part number command[0] = IAP_READ_PART; iap_entry(command, result); const char* partstrptr = NULL; for(int i=0; i<NUM_PARTS; i++) { if(result[1] == partmap[i].id) { partstrptr = partmap[i].name; break; } } // Read part revision partrev=*(uint8_t*)PART_REV_ADDR; if(partrev==0 || partrev > 0x1a) { partrev = '-'; } else { partrev += 'A' - 1; } len = snprintf(buf,sizeof(buf),"%s rev %c",partstrptr,partrev); LCD_disp_str((uint8_t*)buf, len, 0, 64-6, FONT6X6); printf("\nRunning on an %s", buf); LCD_FB_Update(); Keypad_Init(); Buzzer_Init(); ADC_Init(); RTC_Init(); OneWire_Init(); Reflow_Init(); Sched_SetWorkfunc( MAIN_WORK, Main_Work ); Sched_SetState( MAIN_WORK, 1, TICKS_SECS( 2 ) ); // Enable in 2 seconds Buzzer_Beep( BUZZ_1KHZ, 255, TICKS_MS(100) ); while(1) { int32_t sleeptime; sleeptime=Sched_Do( 0 ); // No fast-forward support //printf("\n%d ticks 'til next activity"),sleeptime); } return 0; }
static void modem_init_work_func(struct work_struct *work) { int ret; BSP_SYNC_init(); ret = loadmodem_init(); if (ret) { printk(KERN_ERR "%s loadmodem_init init fail ",__func__); } ret = BSP_MEM_Init(); if (ret) { printk(KERN_ERR "%s BSP_MEM_Init init fail ",__func__); } ret = BSP_ICC_Init(); if (ret) { printk(KERN_ERR "%s BSP_ICC_Init init fail ",__func__); } ret = IPF_Init(); if (ret) { printk(KERN_ERR "%s IPF INIT FAIL\n",__func__); } cshell_icc_open(); #ifdef BSP_C_HIFI_RESET_ALONE_FEATURE ret = reset_sub_mgr_init(); if (ret) { printk(KERN_ERR "%s reset_sub_mgr_init init fail ",__func__); } #endif ret = usb_cshell_init_work(); if (ret) { printk(KERN_ERR "%s cshell init fail ",__func__); } wait_for_completion(&modem_depend_complete); ret = rfile_init_thread(); if (ret) { printk(KERN_ERR "%s rfile init fail ",__func__); } printk(KERN_ERR "%s is or not come in NV init!\n",__func__); ret = NV_Init(); if (ret) { printk(KERN_ERR "%s NV init fail ",__func__); } #ifdef BSP_COMPILE_ALLY printk(KERN_ERR "%s is or not come in VOS_ModuleInit!\n",__func__); ret = VOS_ModuleInit(); if (ret) { printk(KERN_ERR "%s vos module init fail ",__func__); } #endif return; }
int main() { // This must be more dynamic in the future, but right now this IOREF is only used for the analog switches in the 10-pin connector // (UART pins are handled by SIORefGen, and that voltage has to be lower than this IORef voltage) //#define DYN_IOREF #ifdef DYN_IOREF // ~1.0V to 4.1V vref IOVoltGen_Start(); IOVoltGen_SetValue(0x80); IOVoltBuffer_Start(); #else // Results in 5V vref VDDIO2ref_SetDriveMode(VDDIO2ref_DM_STRONG); VDDIO2ref_Write(1); #endif NV_Init(); SIORefGen_Start(); SIORefGen_SetValue(62); // 1V GPIO_SetTXDrive(0); debuguart1_init(); CyGlobalIntEnable; /* Uncomment this line to enable global interrupts. */ CyPins_ClearPin(LED_Status_0); CyPins_SetPin(FanEna_0); if(NVREAD->USBserial[0] != 0 && NVREAD->USBserial[0] != 0xff) { for(uint8_t loopah=0; loopah<8; loopah++) { mySerial[2 + (loopah<<1)] = NVREAD->USBserial[loopah]; // Update USB descriptor Unicode values with our ASCII } USBFS_1_SerialNumString(mySerial); } USB_Init(); CyDelay(500); CyPins_ClearPin(FanEna_0); targetuart_init(); #ifdef SPECIAL_EDITION // Note that VtargetRef is in the 5V quadrant so that pin will always // output 5V when set high, no matter what the IOREF is set to! GPIO_SetPinState( TREF_PIN7, PIN_OUT_HIGH ); // Output on Vref GPIO_SetPinState( DFMS_PIN8, PIN_UART_TX ); // Send on DFMS pin, recv on DTMS! GPIO_SetPinState( DTMS_PIN9, PIN_UART_RX ); #else GPIO_SetPinState( DTMS_PIN9, PIN_UART_TX ); // Send on DTMS pin, recv on DFMS! GPIO_SetPinState( DFMS_PIN8, PIN_UART_RX ); #endif printf("\n\nWJ CDB Assist v3 controller init\n"); FB_init(); FB_clear(); disp_str("CDB ASSIST V3",13,(64-39),0,FONT6X6 | INVERT); disp_str("Sony Mobile",11,(64-33),64-12,FONT6X6); #ifdef SPECIAL_EDITION disp_str("Calibration Edition",19,(64-57),64-6,FONT6X6); #else disp_str("Open Devices",12,(64-36),64-6,FONT6X6); #endif FB_update(); GPIO_Init(); DummyLoad_Init(); USBMux_Init(); I2C_Init(); PWM_Init(); ADC_Init(); uint16_t ctr=0; for(;;) { char buffah[22]; uint8_t num; float vbatvolt,vbatcur,vbusvolt,vbuscur; I2C_Work(); vbatvolt=(float)I2C_Get_VBAT_VoltAvg() * 0.001f; vbatcur=I2C_Get_VBAT_CurAvg(); PWM_Work(I2C_Get_VBAT_Volt(),I2C_Get_VBAT_CurRaw()); DummyLoad_Work(I2C_Get_VBAT_Volt()); ADC_Work(); uint8_t vrefok = ADC_VtargetValid(); static uint8_t oldvrefok = 2; if( vrefok != oldvrefok ) { if( vrefok ) { CyPins_ClearPin(LED_Vref_0); GPIO_SetTXDrive( 1 ); } else { CyPins_SetPin(LED_Vref_0); GPIO_SetTXDrive( 0 ); SIORefGen_SetValue(62); // Default 1V ref } oldvrefok = vrefok; } if(ctr == 0) { vbusvolt=(float)I2C_Get_VBUS_Volt() * 0.001f; vbuscur=I2C_Get_VBUS_Cur(); USBMux_UpdateMeasurements(vbusvolt,vbuscur); num = snprintf(buffah, sizeof(buffah), "VBAT %5.2fV %6.1fmA", vbatvolt,vbatcur); disp_str(buffah, num, 0, 8, FONT6X6); num = snprintf(buffah, sizeof(buffah), "VBUS %5.2fV %6.1fmA", vbusvolt,vbuscur); disp_str(buffah, num, 0, 8+6, FONT6X6); DummyLoad_ADCWork(); float loadcur = DummyLoad_GetCur(); float loadtemp = DummyLoad_GetTemp(); num = snprintf(buffah, sizeof(buffah), "Load %5.1f` %6.1fmA", loadtemp,loadcur); disp_str(buffah, num, 0, 8+12, FONT6X6); float tmp = ADC_GetVoltage(VBATSENSE); num = snprintf(buffah, sizeof(buffah), "VBAT %5.2fV", tmp); disp_str(buffah, num, 0, 8+18, FONT6X6); tmp = ADC_GetVoltage(USB2SENSE); num = snprintf(buffah, sizeof(buffah), "USB2 %5.2fV", tmp); disp_str(buffah, num, 0, 8+24, FONT6X6); tmp = ADC_GetVoltage(USB3SENSE); num = snprintf(buffah, sizeof(buffah), "USB3 %5.2fV", tmp); disp_str(buffah, num, 0, 8+30, FONT6X6); tmp = ADC_GetVoltage(VTARGETSENSE); if( tmp > 4.5f ) { // Assume 5V, disable regulated output CY_SET_REG8(DTMS__SIO_CFG, (CY_GET_REG8(DTMS__SIO_CFG) & 0xcf) | 0x20); CY_SET_REG8(DTMS__SIO_DIFF, (CY_GET_REG8(DTMS__SIO_DIFF) & 0xcf) | 0x00); CY_SET_REG8(DTMS__SIO_HYST_EN, (CY_GET_REG8(DTMS__SIO_HYST_EN) & 0xcf) | 0x00); } else if( tmp > 0.89f ) { float val = tmp * 255.0f / 4.096f; if(val > 255.0f) val = 255.0f; SIORefGen_SetValue((uint8_t)val); CY_SET_REG8(DTMS__SIO_CFG, (CY_GET_REG8(DTMS__SIO_CFG) & 0xcf) | 0x30); // Regulated output buffer CY_SET_REG8(DTMS__SIO_DIFF, (CY_GET_REG8(DTMS__SIO_DIFF) & 0xcf) | 0x20); CY_SET_REG8(DTMS__SIO_HYST_EN, (CY_GET_REG8(DTMS__SIO_HYST_EN) & 0xcf) | 0x20); } num = snprintf(buffah, sizeof(buffah), "VTGT %5.2fV", tmp); disp_str(buffah, num, 0, 8+36, FONT6X6); FB_update(); UpdateCtrl(); ctr=256; } else { ctr--; } USB_Work(); } }