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(); } }
/* ------------------------------------------------------------ */ int main() { list_audio_devices(alcGetString(NULL, ALC_DEVICE_SPECIFIER)); /* BBBIOlib init*/ iolib_init(); iolib_setdir(8,11, BBBIO_DIR_IN); /* Button */ iolib_setdir(8,12, BBBIO_DIR_OUT); /* LED */ // sys_info.capability = SYS_CAPABILITY_VIDEO_Tx | SYS_CAPABILITY_VIDEO_Rx | SYS_CAPABILITY_AUDIO_Tx | SYS_CAPABILITY_AUDIO_Rx; // sys_info.capability = SYS_CAPABILITY_VIDEO_Tx | SYS_CAPABILITY_AUDIO_Tx; sys_info.capability =SYS_CAPABILITY_AUDIO_Rx | SYS_CAPABILITY_VIDEO_Rx; // sys_info.capability = SYS_CAPABILITY_VIDEO_Tx; sys_info.status = SYS_STATUS_INIT; sys_info.cam.width = 320; sys_info.cam.height = 240; // sys_info.cam.pixel_fmt = V4L2_PIX_FMT_YUV420; sys_info.cam.pixel_fmt = V4L2_PIX_FMT_YUYV; /* alloc RGB565 buffer for frame buffer data store */ RGB565_buffer = (unsigned char *)malloc(sys_info.cam.width * sys_info.cam.height *2); /* step Codec register */ avcodec_register_all(); av_register_all(); video_encoder_init(sys_info.cam.width, sys_info.cam.height, sys_info.cam.pixel_fmt); video_decoder_init(sys_info.cam.width, sys_info.cam.height, sys_info.cam.pixel_fmt); printf("Codec init finish\n"); /* step Frame buffer initial*/ if(FB_init() == 0) { fprintf(stderr, "Frame Buffer init error\n"); } FB_clear(var_info.xres, var_info.yres); sys_set_status(SYS_STATUS_IDLE); /* Create Video thread */ if(sys_info.capability & SYS_CAPABILITY_VIDEO_Rx) pthread_create(&Video_Rx_thread, NULL, Video_Rx_loop, NULL); if(sys_info.capability & SYS_CAPABILITY_VIDEO_Tx) pthread_create(&Video_Tx_thread, NULL, Video_Tx_loop, NULL); /* Create Audio thread*/ if(sys_info.capability & SYS_CAPABILITY_AUDIO_Rx) pthread_create(&Audio_Rx_thread, NULL, Audio_Rx_loop, NULL); if(sys_info.capability & SYS_CAPABILITY_AUDIO_Tx) pthread_create(&Audio_Tx_thread, NULL, Audio_Tx_loop, NULL); /* Signale SIGINT */ signal(SIGINT, SIGINT_release); /* Main loop */ while(sys_get_status() != SYS_STATUS_RELEASE) { /* Button on */ if (is_high(8,11)) { sys_set_status(SYS_STATUS_WORK); pin_high(8, 12); /* LED on*/ } else { // FB_clear(var_info.xres, var_info.yres); // sys_set_status(SYS_STATUS_IDLE); sys_set_status(SYS_STATUS_WORK); pin_low(8, 12); /* LED off */ } //usleep(100000); sleep(1); } pin_low(8, 12); /* LED off */ /* ******************************************************* * Main thread for SIP server communication and HW process * * * *******************************************************/ /* release */ if(sys_info.capability & SYS_CAPABILITY_VIDEO_Tx) pthread_join(Video_Tx_thread,NULL); if(sys_info.capability & SYS_CAPABILITY_VIDEO_Rx) pthread_join(Video_Rx_thread,NULL); if(sys_info.capability & SYS_CAPABILITY_AUDIO_Tx) pthread_join(Audio_Tx_thread,NULL); if(sys_info.capability & SYS_CAPABILITY_AUDIO_Rx) pthread_join(Audio_Rx_thread,NULL); munmap(FB_ptr, FB_scerrn_size); close(FB); free(RGB565_buffer); video_encoder_release(); video_decoder_release(); printf("finish\n"); return 0; }