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); }
// // *_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); }