pta = pti * pxmcc->ptreci;
*FPGA_FNCAPPROX_SIN = pta;
- asm volatile("nop\n": : : "memory");
- asm volatile("nop\n": : : "memory");
- asm volatile("nop\n": : : "memory");
+ asm volatile("nop\n");
+ asm volatile("nop\n");
+ asm volatile("nop\n");
pxmcc->ptsin = *FPGA_FNCAPPROX_SIN;
- asm volatile("nop\n": : : "memory");
+ asm volatile("nop\n");
pxmcc->ptcos = *FPGA_FNCAPPROX_COS;
if (pxmcc->ccflg) {
pwm_alp = pwm_d * pxmcc->ptcos - pwm_q * pxmcc->ptsin;
pwm_bet = pwm_d * pxmcc->ptsin + pwm_q * pxmcc->ptcos;
- if (!pxmcc->mode) {
+ if (pxmcc->mode) {
pwm_bet_div_2_k3 = RECI16_2_K3 * (pwm_bet >> 16);
#ifndef SUPPRESS_CONDITIONALS
*uptr = pwm4 | 0x4000;
}
} else {
- if (!pxmcc->mode) {
+ if (pxmcc->mode) {
pwmtx_info = pxmcc->pwmtx_info;
uptr = FPGA_LX_MASTER_TX + ((pwmtx_info >> 0) & 0xff);
pxmcc->pwm_prew[1] = *uptr & 0x3fff;
for (i = 0; i < PXMCC_CURADC_CHANNELS; ) {
val = *siroladc;
- curadc->cur_val = val - curadc->siroladc_last
- - curadc->siroladc_offs;
+ curadc->cur_val = (int16_t)(val - curadc->siroladc_last
+ - curadc->siroladc_offs);
curadc->siroladc_last = val;
- curadc->reserved1=0x11aa;
i++;
curadc += 1;
uint32_t pwm1;
uint32_t pwm2;
uint32_t pwm3;
- int32_t cur[3];
int32_t cur1;
int32_t cur2;
int32_t cur3;
+ int32_t *pcurmult;
uint32_t curmult_idx;
uint32_t pwm_reci;
uint32_t out_info;
#endif /*COMPUTE_PHASE_SECTOR*/
out_info = pxmcc->out_info;
- if (!pxmcc->mode) {
- cur[1] = pxmcc_data.curadc[out_info + 0].cur_val;
- cur[2] = pxmcc_data.curadc[out_info + 1].cur_val;
- cur[0] = pxmcc_data.curadc[out_info + 2].cur_val;
+ if (pxmcc->mode) {
pwm1 = pxmcc->pwm_prew[0];
pwm2 = pxmcc->pwm_prew[1];
curmult_idx = (0x00201201 >> (4 * phs)) & 3;
pwm_reci = pxmcc_data.common.pwm_cycle - pxmcc->pwm_prew[curmult_idx];
pwm_reci = (pxmcc_data.common.pwm_cycle << 16) / pwm_reci;
- cur[curmult_idx] = (int32_t)(pwm_reci * cur[curmult_idx]) >> 16;
- cur1 = cur[0];
- cur2 = cur[1];
- cur3 = cur[2];
+ /*
+ * Translate index from pwm1, pwm2, pwm3 order to
+ * to order of current sources 0->2 1->0 2->1
+ *
+ * This solution modifies directly value in pxmcc_curadc_data_t
+ * so it is destructive and has not to be applied twice,
+ * but it is much better optimized
+ */
+ curmult_idx = (0x102 >> (curmult_idx * 4)) & 3;
+ pcurmult = &pxmcc_data.curadc[out_info + curmult_idx].cur_val;
+ *pcurmult = (int32_t)(pwm_reci * (*pcurmult)) >> 16;
+
+ cur2 = pxmcc_data.curadc[out_info + 0].cur_val;
+ cur3 = pxmcc_data.curadc[out_info + 1].cur_val;
+ cur1 = pxmcc_data.curadc[out_info + 2].cur_val;
if ((phs == 5) || (phs == 0))
cur_alp = -(cur2 + cur3);
uint32_t pwm_reci_bits;
curmult_idx = (((u1gtu3 ^ u1gtu2) | 1) ^ u2gtu3 ^ u1gtu2) & 3;
+
pwm_reci = pxmcc_data.common.pwm_cycle - pxmcc->pwm_prew[curmult_idx];
+
#if 0
pwm_reci_bits = __builtin_clzl(pwm_reci);
#else
#endif
pwm_reci <<= pwm_reci_bits;
*FPGA_FNCAPPROX_RECI = pwm_reci;
- asm volatile("nop\n": : : "memory");
- asm volatile("nop\n": : : "memory");
- asm volatile("nop\n": : : "memory");
+ asm volatile("nop\n");
+ asm volatile("nop\n");
+ asm volatile("nop\n");
pwm_reci = *FPGA_FNCAPPROX_RECI;
pwm_reci >>= 16;
pwm_reci *= pxmcc_data.common.pwm_cycle;
pwm_reci >>= 30 - pwm_reci_bits;
- cur[curmult_idx] = (int32_t)(pwm_reci * cur[curmult_idx]) >> 16;
- cur1 = cur[0];
- cur2 = cur[1];
- cur3 = cur[2];
+ /*
+ * Translate index from pwm1, pwm2, pwm3 order to
+ * to order of current sources 0->2 1->0 2->1
+ *
+ * This solution modifies directly value in pxmcc_curadc_data_t
+ * so it is destructive and has not to be applied twice,
+ * but it is much better optimized
+ */
+ curmult_idx = (0x102 >> (curmult_idx * 4)) & 3;
+ pcurmult = &pxmcc_data.curadc[out_info + curmult_idx].cur_val;
+ *pcurmult = (int32_t)(pwm_reci * (*pcurmult)) >> 16;
+
+ cur2 = pxmcc_data.curadc[out_info + 0].cur_val;
+ cur3 = pxmcc_data.curadc[out_info + 1].cur_val;
+ cur1 = pxmcc_data.curadc[out_info + 2].cur_val;
cur_alp = -(cur2 + cur3); /* 5 0 */
cur_alp &= state50_msk; /* 1 2 3 4 */
pwmtx_info = (9 << 0) | (10 << 8) | (11 << 16);
+ mcc_axis->mode = 1;
+
mcc_axis->inp_info = mcs->pxms_inp_info;
mcc_axis->out_info = mcs->pxms_out_info;
mcc_axis->pwmtx_info = pwmtx_info;
mcc_axis->ccflg = 1;
if (0) {
+ mcc_data->axis[1].inp_info = 1;
+ mcc_data->axis[1].out_info = 3;
mcc_data->axis[1].pwmtx_info = (12 << 0) | (13 << 8) | (14 << 16);
+ mcc_data->axis[1].mode = 1;
mcc_data->axis[1].ccflg = 1;
- mcc_data->axis[2].pwmtx_info = (12 << 0) | (13 << 8) | (14 << 16);
+ mcc_data->axis[2].inp_info = 2;
+ mcc_data->axis[2].out_info = 6;
+ mcc_data->axis[2].pwmtx_info = (15 << 0) | (16 << 8) | (18 << 16);
+ mcc_data->axis[2].mode = 1;
mcc_data->axis[2].ccflg = 1;
- mcc_data->axis[3].pwmtx_info = (12 << 0) | (13 << 8) | (14 << 16);
+ mcc_data->axis[3].inp_info = 3;
+ mcc_data->axis[3].out_info = 9;
+ mcc_data->axis[3].pwmtx_info = (19 << 0) | (20 << 8) | (21 << 16);
+ mcc_data->axis[3].mode = 1;
mcc_data->axis[3].ccflg = 1;
}