static int bcm2835_audio_open_connection(bcm2835_alsa_stream_t * alsa_stream) { static VCHI_INSTANCE_T vchi_instance; static VCHI_CONNECTION_T *vchi_connection; static int initted; AUDIO_INSTANCE_T *instance = alsa_stream->instance; int ret; LOG_DBG(" .. IN\n"); LOG_INFO("%s: start\n", __func__); BUG_ON(instance); if (instance) { LOG_ERR("%s: VCHI instance already open (%p)\n", __func__, instance); instance->alsa_stream = alsa_stream; alsa_stream->instance = instance; ret = 0; // xxx todo -1; goto err_free_mem; } /* Initialize and create a VCHI connection */ if (!initted) { ret = vchi_initialise(&vchi_instance); if (ret != 0) { LOG_ERR("%s: failed to initialise VCHI instance (ret=%d)\n", __func__, ret); ret = -EIO; goto err_free_mem; } ret = vchi_connect(NULL, 0, vchi_instance); if (ret != 0) { LOG_ERR("%s: failed to connect VCHI instance (ret=%d)\n", __func__, ret); ret = -EIO; goto err_free_mem; } initted = 1; } /* Initialize an instance of the audio service */ instance = vc_vchi_audio_init(vchi_instance, &vchi_connection, 1); if (instance == NULL) { LOG_ERR("%s: failed to initialize audio service\n", __func__); ret = -EPERM; goto err_free_mem; } instance->alsa_stream = alsa_stream; alsa_stream->instance = instance; LOG_DBG(" success !\n"); err_free_mem: LOG_DBG(" .. OUT\n"); return ret; }
int main (int argc, const char **argv) { VCHIQ_INSTANCE_T vchiq_instance; int success = -1; char response[ 128 ]; if (!is_filed_running()) { printf("vcfiled not running\n"); exit(-1); } vcos_init(); vcos_set_args(argc, argv); if (vchiq_initialise(&vchiq_instance) != VCHIQ_SUCCESS) { printf("* failed to open vchiq instance\n"); return -1; } // initialise the OS abstraction layer os_init(); vcos_log("vchi_initialise"); success = vchi_initialise( &global_initialise_instance); assert(success == 0); vchiq_instance = (VCHIQ_INSTANCE_T)global_initialise_instance; global_connection = vchi_create_connection(single_get_func_table(), vchi_mphi_message_driver_func_table()); vcos_log("vchi_connect"); vchi_connect(&global_connection, 1, global_initialise_instance); vc_vchi_gencmd_init (global_initialise_instance, &global_connection, 1); vc_vchi_dispmanx_init (global_initialise_instance, &global_connection, 1); vc_vchi_tv_init (global_initialise_instance, &global_connection, 1); vc_vchi_cec_init (global_initialise_instance, &global_connection, 1); vc_vchi_bufman_init (global_initialise_instance, &global_connection, 1); if ( success == 0 ) { success = vc_gencmd( response, sizeof(response), "set_vll_dir /sd/vlls" ); vcos_assert( success == 0 ); } vcos_log("VMCS services initialized."); message_queue_init (); host_app_message_handler (PLATFORM_MSG_INIT, 0, 0); dispatch_messages (); vcos_deinit (); return 0; }
int main(int argc, char *const *argv) { VCHIQ_INSTANCE_T vchiq_instance; int success; progname = argv[0]; const char *sep = strrchr(progname, '/'); if (sep) progname = sep+1; parse_args(argc, argv); if (!foreground) { log_stderr = 0; // must log to syslog if we're a daemon daemonize(); } vcfile_lock(); vcos_init(); if (vchiq_initialise(&vchiq_instance) != VCHIQ_SUCCESS) { logmsg(LOG_ERR, "%s: failed to open vchiq instance\n", argv[0]); return -1; } // initialise the OS abstraction layer os_init(); success = vchi_initialise( &global_initialise_instance); assert(success == 0); vchiq_instance = (VCHIQ_INSTANCE_T)global_initialise_instance; global_connection = vchi_create_connection(single_get_func_table(), vchi_mphi_message_driver_func_table()); vchi_connect(&global_connection, 1, global_initialise_instance); vc_vchi_filesys_init (global_initialise_instance, &global_connection, 1); for (;;) { sleep(INT_MAX); } vcos_deinit (); return 0; }
int tvserviceInit() { if (initialized) return 0; VCHI_INSTANCE_T vchi_instance; VCHI_CONNECTION_T *vchi_connections; // initialise bcm_host initializeBCM(); // initialise vcos/vchi initializeVCOS(); if (vchi_initialise(&vchi_instance) != VCHIQ_SUCCESS) { logInfo(LOG_TVSERVICE, "failed to open vchiq instance\n"); return -2; } // create a vchi connection if ( vchi_connect( NULL, 0, vchi_instance ) != 0) { logInfo(LOG_TVSERVICE, "failed to connect to VCHI\n"); return -3; } // connect to tvservice if ( vc_vchi_tv_init( vchi_instance, &vchi_connections, 1) != 0) { logInfo(LOG_TVSERVICE, "failed to connect to tvservice\n"); return -4; } vc_tv_register_callback(&tvserviceCallback, NULL); tvstate = malloc(sizeof(TV_GET_STATE_RESP_T)); vc_tv_get_state(tvstate); logInfo(LOG_TVSERVICE, "tvstate: %dx%d, %d fps, %s\n", tvstate->width, tvstate->height, tvstate->frame_rate, tvstate->scan_mode ? "interlaced" : "progressive"); if (vc_tv_hdmi_set_spd("1st Setup", "piMythClient", HDMI_SPD_TYPE_PMP) != 0) { logInfo(LOG_TVSERVICE, "failed to vc_tv_hdmi_set_spd\n"); } initialized = 1; return 0; }
void bcm_host_init(void) { VCHIQ_INSTANCE_T vchiq_instance; static int initted; int success = -1; char response[ 128 ]; if (initted) return; initted = 1; vcos_init(); if (vchiq_initialise(&vchiq_instance) != VCHIQ_SUCCESS) { printf("* failed to open vchiq instance\n"); exit(-1); } vcos_log("vchi_initialise"); success = vchi_initialise( &global_initialise_instance); vcos_assert(success == 0); vchiq_instance = (VCHIQ_INSTANCE_T)global_initialise_instance; global_connection = vchi_create_connection(single_get_func_table(), vchi_mphi_message_driver_func_table()); vcos_log("vchi_connect"); vchi_connect(&global_connection, 1, global_initialise_instance); vc_vchi_gencmd_init (global_initialise_instance, &global_connection, 1); vc_vchi_dispmanx_init (global_initialise_instance, &global_connection, 1); vc_vchi_tv_init (global_initialise_instance, &global_connection, 1); vc_vchi_cec_init (global_initialise_instance, &global_connection, 1); //vc_vchi_bufman_init (global_initialise_instance, &global_connection, 1); if ( success == 0 ) { success = vc_gencmd( response, sizeof(response), "set_vll_dir /sd/vlls" ); vcos_assert( success == 0 ); } }
int graphics_setup(void) { #ifdef PICASSO96 picasso_InitResolutions(); InitPicasso96(); #endif VCHI_INSTANCE_T vchi_instance; VCHI_CONNECTION_T *vchi_connection; TV_DISPLAY_STATE_T tvstate; if(vchi_initialise(&vchi_instance) == 0) { if(vchi_connect(NULL, 0, vchi_instance) == 0) { vc_vchi_tv_init(vchi_instance, &vchi_connection, 1); if(vc_tv_get_display_state(&tvstate) == 0) { HDMI_PROPERTY_PARAM_T property; property.property = HDMI_PROPERTY_PIXEL_CLOCK_TYPE; vc_tv_hdmi_get_property(&property); float frame_rate = property.param1 == HDMI_PIXEL_CLOCK_TYPE_NTSC ? tvstate.display.hdmi.frame_rate * (1000.0f/1001.0f) : tvstate.display.hdmi.frame_rate; host_hz = (int)frame_rate; time_per_host_frame = time_for_host_hz_frames / host_hz; } vc_vchi_tv_stop(); vchi_disconnect(vchi_instance); } } if(display_pipe == 0) { display_pipe = xmalloc (smp_comm_pipe, 1); init_comm_pipe(display_pipe, 20, 1); } if(display_sem == 0) { uae_sem_init (&display_sem, 0, 0); } if(display_tid == 0 && display_pipe != 0 && display_sem != 0) { uae_start_thread(_T("render"), display_thread, NULL, &display_tid); } write_comm_pipe_u32(display_pipe, DISPLAY_SIGNAL_SETUP, 1); return 1; }
/* VCHIQ stuff */ static void bcm2835_audio_init(struct bcm2835_audio_info *sc) { int status; /* Initialize and create a VCHI connection */ status = vchi_initialise(&sc->vchi_instance); if (status != 0) { printf("vchi_initialise failed: %d\n", status); return; } status = vchi_connect(NULL, 0, sc->vchi_instance); if (status != 0) { printf("vchi_connect failed: %d\n", status); return; } SERVICE_CREATION_T params = { VCHI_VERSION_EX(VC_AUDIOSERV_VER, VC_AUDIOSERV_MIN_VER), VC_AUDIO_SERVER_NAME, /* 4cc service code */ sc->vchi_connection, /* passed in fn pointers */ 0, /* rx fifo size */ 0, /* tx fifo size */ bcm2835_audio_callback, /* service callback */ sc, /* service callback parameter */ 1, 1, 0 /* want crc check on bulk transfers */ }; status = vchi_service_open(sc->vchi_instance, ¶ms, &sc->vchi_handle); if (status == 0) /* Finished with the service for now */ vchi_service_release(sc->vchi_handle); else sc->vchi_handle = VCHIQ_SERVICE_HANDLE_INVALID; }
int main( int argc, char **argv ) { int32_t ret; char optstring[OPTSTRING_LEN]; int opt; int opt_preferred = 0; int opt_explicit = 0; int opt_sdtvon = 0; int opt_off = 0; int opt_modes = 0; int opt_monitor = 0; int opt_status = 0; int opt_audiosup = 0; int opt_dumpedid = 0; int opt_showinfo = 0; int opt_3d = 0; int opt_json = 0; int opt_name = 0; char *dumpedid_filename = NULL; VCHI_INSTANCE_T vchi_instance; VCHI_CONNECTION_T *vchi_connection; HDMI_RES_GROUP_T power_on_explicit_group = HDMI_RES_GROUP_INVALID; uint32_t power_on_explicit_mode; uint32_t power_on_explicit_drive = HDMI_MODE_HDMI; HDMI_RES_GROUP_T get_modes_group = HDMI_RES_GROUP_INVALID; SDTV_MODE_T sdtvon_mode; SDTV_ASPECT_T sdtvon_aspect; // Initialize VCOS vcos_init(); // Create the option string that we will be using to parse the arguments create_optstring( optstring ); // Parse the command line arguments while (( opt = getopt_long_only( argc, argv, optstring, long_opts, NULL )) != -1 ) { switch ( opt ) { case 0: { // getopt_long returns 0 for entries where flag is non-NULL break; } case OPT_PREFERRED: { opt_preferred = 1; break; } case OPT_EXPLICIT: { char group_str[32], drive_str[32]; /* coverity[secure_coding] String length specified, so can't overflow */ int s = sscanf( optarg, "%31s %u %31s", group_str, &power_on_explicit_mode, drive_str ); if ( s != 2 && s != 3 ) { LOG_ERR( "Invalid arguments '%s'", optarg ); goto err_out; } // Check the group first if ( vcos_strcasecmp( "CEA", group_str ) == 0 ) { power_on_explicit_group = HDMI_RES_GROUP_CEA; } else if ( vcos_strcasecmp( "DMT", group_str ) == 0 ) { power_on_explicit_group = HDMI_RES_GROUP_DMT; } else if ( vcos_strcasecmp( "CEA_3D", group_str ) == 0 || vcos_strcasecmp( "CEA_3D_SBS", group_str ) == 0) { power_on_explicit_group = HDMI_RES_GROUP_CEA; opt_3d = 1; } else if ( vcos_strcasecmp( "CEA_3D_TB", group_str ) == 0 ) { power_on_explicit_group = HDMI_RES_GROUP_CEA; opt_3d = 2; } else { LOG_ERR( "Invalid group '%s'", group_str ); goto err_out; } if (s==3) { if (vcos_strcasecmp( "HDMI", drive_str ) == 0 ) { power_on_explicit_drive = HDMI_MODE_HDMI; } else if (vcos_strcasecmp( "DVI", drive_str ) == 0 ) { power_on_explicit_drive = HDMI_MODE_DVI; } else { LOG_ERR( "Invalid drive '%s'", drive_str ); goto err_out; } } // Then check if mode is a sane number if ( power_on_explicit_mode > MAX_MODE_ID ) { LOG_ERR( "Invalid mode '%u'", power_on_explicit_mode ); goto err_out; } opt_explicit = 1; break; } case OPT_SDTVON: { char mode_str[32], aspect_str[32]; if ( sscanf( optarg, "%s %s", mode_str, aspect_str ) != 2 ) { LOG_ERR( "Invalid arguments '%s'", optarg ); goto err_out; } // Check the group first if ( vcos_strcasecmp( "NTSC", mode_str ) == 0 ) { sdtvon_mode = SDTV_MODE_NTSC; } else if ( vcos_strcasecmp( "NTSC_J", mode_str ) == 0 ) { sdtvon_mode = SDTV_MODE_NTSC_J; } else if ( vcos_strcasecmp( "PAL", mode_str ) == 0 ) { sdtvon_mode = SDTV_MODE_PAL; } else if ( vcos_strcasecmp( "PAL_M", mode_str ) == 0 ) { sdtvon_mode = SDTV_MODE_PAL_M; } else { LOG_ERR( "Invalid mode '%s'", mode_str ); goto err_out; } if ( vcos_strcasecmp( "4:3", aspect_str ) == 0 ) { sdtvon_aspect = SDTV_ASPECT_4_3; } else if ( vcos_strcasecmp( "14:9", aspect_str ) == 0 ) { sdtvon_aspect = SDTV_ASPECT_14_9; } else if ( vcos_strcasecmp( "16:9", aspect_str ) == 0 ) { sdtvon_aspect = SDTV_ASPECT_16_9; } opt_sdtvon = 1; break; } case OPT_OFF: { opt_off = 1; break; } case OPT_MODES: { if ( vcos_strcasecmp( "CEA", optarg ) == 0 ) { get_modes_group = HDMI_RES_GROUP_CEA; } else if ( vcos_strcasecmp( "DMT", optarg ) == 0 ) { get_modes_group = HDMI_RES_GROUP_DMT; } else { LOG_ERR( "Invalid group '%s'", optarg ); goto err_out; } opt_modes = 1; break; } case OPT_MONITOR: { opt_monitor = 1; break; } case OPT_STATUS: { opt_status = 1; break; } case OPT_AUDIOSUP: { opt_audiosup = 1; break; } case OPT_DUMPEDID: { opt_dumpedid = 1; dumpedid_filename = optarg; break; } case OPT_SHOWINFO: { opt_showinfo = atoi(optarg)+1; break; } case OPT_JSON: { opt_json = 1; break; } case OPT_NAME: { opt_name = 1; break; } default: { LOG_ERR( "Unrecognized option '%d'\n", opt ); goto err_usage; } case '?': case OPT_HELP: { goto err_usage; } } // end switch } // end while argc -= optind; argv += optind; if (( optind == 1 ) || ( argc > 0 )) { if ( argc > 0 ) { LOG_ERR( "Unrecognized argument -- '%s'", *argv ); } goto err_usage; } if (( opt_preferred + opt_explicit + opt_sdtvon > 1 )) { LOG_ERR( "Conflicting power on options" ); goto err_usage; } if ((( opt_preferred == 1 ) || ( opt_explicit == 1 ) || ( opt_sdtvon == 1)) && ( opt_off == 1 )) { LOG_ERR( "Cannot power on and power off simultaneously" ); goto err_out; } // Initialize the VCHI connection ret = vchi_initialise( &vchi_instance ); if ( ret != 0 ) { LOG_ERR( "Failed to initialize VCHI (ret=%d)", ret ); goto err_out; } ret = vchi_connect( NULL, 0, vchi_instance ); if ( ret != 0) { LOG_ERR( "Failed to create VCHI connection (ret=%d)", ret ); goto err_out; } // LOG_INFO( "Starting tvservice" ); // Initialize the tvservice vc_vchi_tv_init( vchi_instance, &vchi_connection, 1 ); if ( opt_monitor == 1 ) { LOG_STD( "Starting to monitor for HDMI events" ); if ( start_monitor() != 0 ) { goto err_stop_service; } } if ( opt_modes == 1 ) { if ( get_modes( get_modes_group, opt_json ) != 0 ) { goto err_stop_service; } } if ( opt_preferred == 1 ) { if ( power_on_preferred() != 0 ) { goto err_stop_service; } } else if ( opt_explicit == 1 ) { //Distinguish between turning on 3D side by side and 3D top/bottom if(opt_3d == 1 && set_property( HDMI_PROPERTY_3D_STRUCTURE, HDMI_3D_FORMAT_SBS_HALF, 0) != 0) { goto err_stop_service; } else if(opt_3d == 2 && set_property( HDMI_PROPERTY_3D_STRUCTURE, HDMI_3D_FORMAT_TB_HALF, 0) != 0) { goto err_stop_service; } if ( power_on_explicit( power_on_explicit_group, power_on_explicit_mode, power_on_explicit_drive ) != 0 ) { goto err_stop_service; } } else if ( opt_sdtvon == 1 ) { if ( power_on_sdtv( sdtvon_mode, sdtvon_aspect ) != 0 ) { goto err_stop_service; } } else if (opt_off == 1 ) { if ( power_off() != 0 ) { goto err_stop_service; } } if ( opt_status == 1 ) { if ( get_status() != 0 ) { goto err_stop_service; } } if ( opt_audiosup == 1 ) { if ( get_audiosup() != 0 ) { goto err_stop_service; } } if ( opt_dumpedid == 1 ) { if ( dump_edid(dumpedid_filename) != 0 ) { goto err_stop_service; } } if ( opt_showinfo ) { if ( show_info(opt_showinfo-1) != 0 ) { goto err_stop_service; } } if ( opt_name == 1 ) { TV_DEVICE_ID_T id; memset(&id, 0, sizeof(id)); if(vc_tv_get_device_id(&id) == 0) { if(id.vendor[0] == '\0' || id.monitor_name[0] == '\0') { LOG_ERR( "No device present" ); } else { LOG_STD( "device_name=%s-%s", id.vendor, id.monitor_name); } } else { LOG_ERR( "Failed to obtain device name" ); } } if ( opt_monitor == 1 ) { // Wait until we get the signal to exit vcos_event_wait( &quit_event ); vcos_event_delete( &quit_event ); } err_stop_service: // LOG_INFO( "Stopping tvservice" ); // Stop the tvservice vc_vchi_tv_stop(); // Disconnect the VCHI connection vchi_disconnect( vchi_instance ); exit( 0 ); err_usage: show_usage(); err_out: exit( 1 ); }
int main(int argc, char **argv) { VCHIQ_INSTANCE_T vchiq_instance; VCHI_INSTANCE_T initialise_instance; VCHI_CONNECTION_T *connection; int success = -1; ILCS_CONFIG_T config; char response[ 128 ]; printf("vcos_init\n"); vcos_init(); if (vchiq_initialise(&vchiq_instance) != VCHIQ_SUCCESS) { printf("* failed to open vchiq instance\n"); return -1; } // initialise the OS abstraction layer os_init(); // initialise the mphi driver // mphi_get_func_table()->init(); // initialise the vchi layer printf("vchi_initialise\n"); success = vchi_initialise( &initialise_instance); assert(success == 0); vchiq_instance = (VCHIQ_INSTANCE_T)initialise_instance; connection = vchi_create_connection(single_get_func_table(), vchi_mphi_message_driver_func_table()); printf("vchi_connect\n"); vchi_connect(&connection, 1, initialise_instance); vc_vchi_gencmd_init(initialise_instance, &connection, 1); vc_vchi_filesys_init(initialise_instance, &connection, 1); if ( success == 0 ) { success = vc_gencmd( response, sizeof(response), "set_vll_dir /sd/vlls" ); vcos_assert( success == 0 ); } printf("vcilcs_config\n"); vcilcs_config(&config); printf("ilcs_init\n"); il_service_global = ilcs_init(vchiq_instance, &config, 0, host_OMX_SetILCSState); printf("do_stripes\n"); do_stripes_default(); printf("do_blocks_test\n"); do_blocks_test(); printf("do_playback_api_test\n"); do_playback_api_test(); return 0; }
static void crt_rpi_switch(int width, int height, float hz) { char buffer[1024]; VCHI_INSTANCE_T vchi_instance; VCHI_CONNECTION_T *vchi_connection = NULL; static char output[250] = {0}; static char output1[250] = {0}; static char output2[250] = {0}; static char set_hdmi[250] = {0}; static char set_hdmi_timing[250] = {0}; int i = 0; int hfp = 0; int hsp = 0; int hbp = 0; int vfp = 0; int vsp = 0; int vbp = 0; int hmax = 0; int vmax = 0; int pdefault = 8; int pwidth = 0; float roundw = 0.0f; float roundh = 0.0f; float pixel_clock = 0; int ip_flag = 0; /* set core refresh from hz */ video_monitor_set_refresh_rate(hz); /* following code is the mode line generator */ pwidth = width; if (height < 400 && width > 400) pwidth = width / 2; roundw = roundf((float)pwidth / (float)height * 100) / 100; if (height > width) roundw = roundf((float)height / (float)width * 100) / 100; if (roundw > 1.35) roundw = 1.25; if (roundw < 1.20) roundw = 1.34; hfp = width * 0.065; hsp = width * 0.1433-hfp+(crt_center_adjust*4); hbp = width * 0.3-hsp-hfp; if (height < 241) vmax = 261; if (height < 241 && hz > 56 && hz < 58) vmax = 280; if (height < 241 && hz < 55) vmax = 313; if (height > 250 && height < 260 && hz > 54) vmax = 296; if (height > 250 && height < 260 && hz > 52 && hz < 54) vmax = 285; if (height > 250 && height < 260 && hz < 52) vmax = 313; if (height > 260 && height < 300) vmax = 318; if (height > 400 && hz > 56) vmax = 533; if (height > 520 && hz < 57) vmax = 580; if (height > 300 && hz < 56) vmax = 615; if (height > 500 && hz < 56) vmax = 624; if (height > 300) pdefault = pdefault * 2; vfp = (height + ((vmax - height) / 2) - pdefault) - height; if (height < 300) vsp = vfp + 3; /* needs to be 3 for progressive */ if (height > 300) vsp = vfp + 6; /* needs to be 6 for interlaced */ vsp = 3; vbp = (vmax-height)-vsp-vfp; hmax = width+hfp+hsp+hbp; if (height < 300) { pixel_clock = (hmax * vmax * hz) ; ip_flag = 0; } if (height > 300) { pixel_clock = (hmax * vmax * (hz/2)) /2 ; ip_flag = 1; } /* above code is the modeline generator */ snprintf(set_hdmi_timing, sizeof(set_hdmi_timing), "hdmi_timings %d 1 %d %d %d %d 1 %d %d %d 0 0 0 %f %d %f 1 ", width, hfp, hsp, hbp, height, vfp,vsp, vbp, hz, ip_flag, pixel_clock); vcos_init(); vchi_initialise(&vchi_instance); vchi_connect(NULL, 0, vchi_instance); vc_vchi_gencmd_init(vchi_instance, &vchi_connection, 1); vc_gencmd(buffer, sizeof(buffer), set_hdmi_timing); vc_gencmd_stop(); vchi_disconnect(vchi_instance); snprintf(output1, sizeof(output1), "tvservice -e \"DMT 87\" > /dev/null"); system(output1); snprintf(output2, sizeof(output1), "fbset -g %d %d %d %d 24 > /dev/null", width, height, width, height); system(output2); }
int main( int argc, char **argv ) { int instNum = 0; VCHI_INSTANCE_T vchi_instance; VCHI_CONNECTION_T *vchi_connection = NULL; if ( argc > 1 ) { if (( strcmp( argv[1], "0" ) == 0 ) || ( strcmp( argv[1], "1" ) == 0 )) { instNum = atoi( argv[1] ); argv++; argc--; } } vcos_init(); if ( vchi_initialise( &vchi_instance ) != 0) { printf( "VCHI initialization failed\n" ); return -1; } //create a vchi connection if ( vchi_connect( NULL, 0, vchi_instance ) != 0) { printf( "VCHI connection failed\n" ); return -1; } vc_vchi_gencmd_init(vchi_instance, &vchi_connection, 1 ); if (argc > 1) { int i = 1; char buffer[ 1024 ]; size_t buffer_offset = 0; clock_t before=0, after=0; double time_diff; uint32_t show_time = 0; int ret; //reset the string buffer[0] = '\0'; //first, strip out a potential leading -t if( strcmp( argv[1], "-t" ) == 0 ) { show_time = 1; i++; } for (; i <= argc-1; i++) { buffer_offset = vcos_safe_strcpy( buffer, argv[i], sizeof(buffer), buffer_offset ); buffer_offset = vcos_safe_strcpy( buffer, " ", sizeof(buffer), buffer_offset ); } if( show_time ) before = clock(); //send the gencmd for the argument if (( ret = vc_gencmd_send( "%s", buffer )) != 0 ) { printf( "vc_gencmd_send returned %d\n", ret ); } //get + print out the response! if (( ret = vc_gencmd_read_response( buffer, sizeof( buffer ) )) != 0 ) { printf( "vc_gencmd_read_response returned %d\n", ret ); } if( show_time ) after = clock(); if( show_time ) { time_diff = ((double) (after - before)) / CLOCKS_PER_SEC; printf( "Time took %f seconds (%f msecs) (%f usecs)\n", time_diff, time_diff * 1000, time_diff * 1000000 ); } if ( buffer[0] != '\0' ) { if ( buffer[ strlen( buffer) - 1] == '\n' ) { fputs( buffer, stdout ); } else { printf("%s\n", buffer ); } } } vc_gencmd_stop(); //close the vchi connection if ( vchi_disconnect( vchi_instance ) != 0) { printf( "VCHI disconnect failed\n" ); return -1; } return 0; }
int main(int argc, char **argv) { int res = 0; CURLcode curlerr; VCHI_INSTANCE_T vchiq_instance; VCHI_CONNECTION_T *vchi_connection; CEC_AllDevices_T logical_address; uint16_t physical_address; /* Make sure logs are written to disk */ setlinebuf(stdout); setlinebuf(stderr); if (argc > 2) { printf("usage: %s [port]\n", argv[0]); return -1; } if (argc == 2) { port = atoi(argv[1]); } curlerr = curl_global_init(CURL_GLOBAL_NOTHING); if ( curlerr ) { printf("failed to init curl error=%d \"%s\"\n", curlerr, curl_easy_strerror(curlerr)); return -1; } res = vchi_initialise(&vchiq_instance); if ( res != VCHIQ_SUCCESS ) { printf("failed to open vchiq instance\n"); return -1; } res = vchi_connect( NULL, 0, vchiq_instance ); if ( res != 0 ) { printf( "VCHI connection failed\n" ); return -1; } vc_vchi_cec_init(vchiq_instance, &vchi_connection, 1); if ( res != 0 ) { printf( "VCHI CEC connection failed\n" ); return -1; } vc_cec_register_callback(((CECSERVICE_CALLBACK_T) cec_callback), NULL); #if 0 vc_cec_register_all(); #endif vc_cec_get_logical_address(&logical_address); printf("logical_address: 0x%x\n", logical_address); vc_cec_set_vendor_id(CEC_VENDOR_ID_BROADCOM); vc_cec_set_osd_name("XBMC"); vc_cec_get_physical_address(&physical_address); printf("physical_address: 0x%x\n", physical_address); vc_cec_send_ActiveSource(physical_address, 0); while (1) { might_be_dimmed = 1; sleep(10); } vchi_exit(); curl_global_cleanup(); return 0; }