Exemple #1
0
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;
}
Exemple #3
0
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();
    }
}