예제 #1
0
static void hpg_write(void *void_hpg, long period) {
    hal_pru_generic_t *hpg      = void_hpg;

    hpg_stepgen_update(hpg, period);
    hpg_pwmgen_update(hpg);
    hpg_encoder_update(hpg);
    hpg_wait_update(hpg);

}
예제 #2
0
//
// *_force_write sets up any persistent state data required that does not get
// written by the standard *_update() procedure, above
//
void hpg_encoder_force_write(hal_pru_generic_t *hpg) {
    int i, j;

    if (hpg->encoder.num_instances <= 0) return;

    for (i = 0; i < hpg->encoder.num_instances; i ++) {

        PRU_task_encoder_t *pru = (PRU_task_encoder_t *) ((u32) hpg->pru_data + (u32) hpg->encoder.instance[i].task.addr);

        // Global data common to all channels
        hpg->encoder.instance[i].pru.task.hdr.mode  = eMODE_ENCODER;
        hpg->encoder.instance[i].pru.task.hdr.len   = hpg->encoder.instance[i].num_channels;
        hpg->encoder.instance[i].pru.task.hdr.dataX = 0x00;
        hpg->encoder.instance[i].pru.task.hdr.dataY = 0x00;
        hpg->encoder.instance[i].pru.task.hdr.addr  = hpg->encoder.instance[i].task.next;

        hpg->encoder.instance[i].pru.pin_invert = 0;
        hpg->encoder.instance[i].pru.LUT        = hpg->encoder.instance[i].LUT;

        *pru = hpg->encoder.instance[i].pru;

        hpg->encoder.instance[i].written_pin_invert = hpg->encoder.instance[i].pru.pin_invert;

        // Per-channel data
        PRU_encoder_chan_t *pruchan = (PRU_encoder_chan_t *) ((u32) hpg->pru_data + (u32) hpg->encoder.instance[i].task.addr + sizeof(hpg->encoder.instance[i].pru));

        for (j = 0; j < hpg->encoder.instance[i].num_channels; j ++) {
            hpg->encoder.instance[i].chan[j].pru.hdr.A_pin = hpg->encoder.instance[i].chan[j].hal.param.A_pin;
            hpg->encoder.instance[i].chan[j].pru.hdr.B_pin = hpg->encoder.instance[i].chan[j].hal.param.B_pin;
            hpg->encoder.instance[i].chan[j].pru.hdr.Z_pin = hpg->encoder.instance[i].chan[j].hal.param.index_pin;
            hpg->encoder.instance[i].chan[j].pru.hdr.mode  = hpg->encoder.instance[i].chan[j].hal.param.counter_mode;

            hpg->encoder.instance[i].chan[j].pru.raw.dword[1]  = 0;
            hpg->encoder.instance[i].chan[j].pru.raw.dword[2]  = 0;

            pruchan[j] = hpg->encoder.instance[i].chan[j].pru;

            hpg->encoder.instance[i].chan[j].written_state = hpg->encoder.instance[i].chan[j].pru.raw.dword[0];
        }

        // LUT Table
        PRU_encoder_LUT_t *pru_lut = (PRU_encoder_LUT_t *) ((u32) hpg->pru_data + (u32) hpg->encoder.instance[i].LUT);
        *pru_lut = Counter_LUT;
    }

    // Call the regular update routine to finish up
    hpg_encoder_update(hpg);
}