/* ------------------------------------------------------------ */ 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; }
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(); } }
/* ------------------------------------------------------------ */ static void *Video_Rx_loop() { int Rx_socket; struct sockaddr_in Rx_addr; struct VOD_DataPacket_struct Rx_Buffer ; /* Socket init */ if(Rx_socket_init(&Rx_socket, &Rx_addr, VIDEO_NET_PORT) ==0) { fprintf(stderr, "Rx Socket init \n"); return NULL; } printf("Rx socket init finish\n"); /* receive data */ int recv_len ; AVPacket packet ; int remain_size =0; unsigned char *RGB_buffer =NULL; /* feedback pointer */ int ID ; fd_set fds; struct timeval tv; int r; while(sys_get_status() != SYS_STATUS_RELEASE) { /* Rx video data */ while(sys_get_status() == SYS_STATUS_WORK) { /* Timeout. */ FD_ZERO(&fds); FD_SET(Rx_socket, &fds); tv.tv_sec = 2; tv.tv_usec = 0; r = select(Rx_socket + 1, &fds, NULL, NULL, &tv); if (r == -1) { fprintf(stderr, "select"); goto VIDEO_RX_RELEASE ; } if (r == 0) { //fprintf(stderr, "select timeout\n"); /* Timeout to clear FrameBuffer */ FB_clear(var_info.xres, var_info.yres); continue; } /* Receive Data */ recv_len = recv(Rx_socket, (char*)&Rx_Buffer, sizeof(Rx_Buffer) , 0) ; if(recv_len == -1) { fprintf(stderr ,"Stream data recv() error\n"); break ; } else { switch(Rx_Buffer.DataType) { case VOD_PACKET_TYPE_FRAME_HEADER : /* AVPacket as header */ memcpy(&packet, &Rx_Buffer.header , sizeof(AVPacket)); packet.data = (unsigned char *)malloc(sizeof(char) * packet.size); remain_size = packet.size; break ; case VOD_PACKET_TYPE_FRAME_DATA : /* AVPacket.data */ ID = Rx_Buffer.data.ID ; memcpy(packet.data + ID * 1024, &Rx_Buffer.data.data[0] , Rx_Buffer.data.size); remain_size -= Rx_Buffer.data.size; /* receive finish */ if(remain_size <= 0) { /* Decode frame */ video_decoder(packet.data, packet.size, &RGB_buffer); /* Display in Frame buffer*/ RGB24_to_RGB565(RGB_buffer, RGB565_buffer, sys_info.cam.width, sys_info.cam.height); FB_display(RGB565_buffer, 0, 0, sys_info.cam.width, sys_info.cam.height); av_free_packet(&packet); } break ; } } } usleep(50000); } VIDEO_RX_RELEASE : close(Rx_socket); printf("Video Rx finish\n"); pthread_exit(NULL); }