Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
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;
}
Ejemplo n.º 3
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;
}