int hpg_encoder_init(hal_pru_generic_t *hpg){ int r,i; if (hpg->config.num_encoders <= 0) return 0; rtapi_print("hpg_encoder_init\n"); // FIXME: Support multiple encoder tasks like so: num_encoders=3,4,2,5 // hpg->encoder.num_instances = hpg->config.num_encoders; hpg->encoder.num_instances = 1; // Allocate HAL shared memory for instance state data hpg->encoder.instance = (hpg_encoder_instance_t *) hal_malloc(sizeof(hpg_encoder_instance_t) * hpg->encoder.num_instances); if (hpg->encoder.instance == 0) { HPG_ERR("ERROR: hal_malloc() failed\n"); return -1; } rtapi_print("malloc: hpg_encoder_instance_t = %p\n",hpg->encoder.instance); // Clear memory memset(hpg->encoder.instance, 0, (sizeof(hpg_encoder_instance_t) * hpg->encoder.num_instances) ); for (i=0; i < hpg->encoder.num_instances; i++) { // FIXME: Support multiple instances like so: num_encoders=3,4,2,5 hpg->encoder.instance[i].num_channels = hpg->config.num_encoders; // Allocate HAL shared memory for channel state data hpg->encoder.instance[i].chan = (hpg_encoder_channel_instance_t *) hal_malloc(sizeof(hpg_encoder_channel_instance_t) * hpg->encoder.instance[i].num_channels); if (hpg->encoder.instance[i].chan == 0) { HPG_ERR("ERROR: hal_malloc() failed\n"); return -1; } rtapi_print("malloc: hpg_encoder_channel_instance_t = %p\n",hpg->encoder.instance[i].chan); int len = sizeof(hpg->encoder.instance[i].pru) + (sizeof(PRU_encoder_chan_t) * hpg->encoder.instance[i].num_channels); hpg->encoder.instance[i].task.addr = pru_malloc(hpg, len); hpg->encoder.instance[i].pru.task.hdr.mode = eMODE_ENCODER; hpg->encoder.instance[i].LUT = pru_malloc(hpg, sizeof(Counter_LUT)); pru_task_add(hpg, &(hpg->encoder.instance[i].task)); if ((r = export_encoder(hpg,i)) != 0){ HPG_ERR("ERROR: failed to export encoder %i: %i\n",i,r); return -1; } } return 0; }
int hpg_wait_init(hal_pru_generic_t *hpg) { int r; hpg->wait.task.addr = pru_malloc(hpg, sizeof(hpg->wait.pru)); pru_task_add(hpg, &(hpg->wait.task)); r = hal_pin_u32_newf(HAL_IN, &(hpg->hal.pin.pru_busy_pin), hpg->config.comp_id, "%s.pru_busy_pin", hpg->config.name); if (r != 0) { return r; } *(hpg->hal.pin.pru_busy_pin) = 0x80; return 0; }
int hpg_pwmgen_init(hal_pru_generic_t *hpg){ int r,i; if (hpg->config.num_pwmgens <= 0) return 0; rtapi_print("hpg_pwm_init\n"); // FIXME: Support multiple PWMs like so: num_pwmgens=3,4,2,5 // hpg->pwmgen.num_instances = hpg->config.num_pwmgens; hpg->pwmgen.num_instances = 1; // Allocate HAL shared memory for instance state data hpg->pwmgen.instance = (hpg_pwmgen_instance_t *) hal_malloc(sizeof(hpg_pwmgen_instance_t) * hpg->pwmgen.num_instances); if (hpg->pwmgen.instance == 0) { HPG_ERR("ERROR: hal_malloc() failed\n"); return -1; } // Clear memory memset(hpg->pwmgen.instance, 0, (sizeof(hpg_pwmgen_instance_t) * hpg->pwmgen.num_instances) ); for (i=0; i < hpg->pwmgen.num_instances; i++) { // FIXME: Support multiple PWMs like so: num_pwmgens=3,4,2,5 hpg->pwmgen.instance[i].num_outputs = hpg->config.num_pwmgens; // Allocate HAL shared memory for output state data hpg->pwmgen.instance[i].out = (hpg_pwmgen_output_instance_t *) hal_malloc(sizeof(hpg_pwmgen_output_instance_t) * hpg->pwmgen.instance[i].num_outputs); if (hpg->pwmgen.instance[i].out == 0) { HPG_ERR("ERROR: hal_malloc() failed\n"); return -1; } int len = sizeof(hpg->pwmgen.instance[i].pru) + (sizeof(PRU_pwm_output_t) * hpg->pwmgen.instance[i].num_outputs); hpg->pwmgen.instance[i].task.addr = pru_malloc(hpg, len); hpg->pwmgen.instance[i].pru.task.hdr.mode = eMODE_PWM; pru_task_add(hpg, &(hpg->pwmgen.instance[i].task)); if ((r = export_pwmgen(hpg,i)) != 0){ HPG_ERR("ERROR: failed to export pwmgen %i: %i\n",i,r); return -1; } } return 0; }