arch: cxd56xx: Support execution error by SCU sequencer
Enable interrupt by SCU sequencer execution error. If the interrupt occurs, then it stops the sequencer and returns the error code.
This commit is contained in:
parent
ba6201401f
commit
f548ffa7a7
@ -196,6 +196,7 @@ struct cxd56_scudev_s
|
||||
uint8_t oneshot; /* Bitmap for Oneshots */
|
||||
|
||||
sem_t oneshotwait[3]; /* Semaphore for wait oneshot sequence is done */
|
||||
int oneshoterr[3]; /* error code for oneshot sequencer */
|
||||
|
||||
struct ev_notify_s event[3]; /* MATHFUNC event notify */
|
||||
struct wm_notify_s wm[14]; /* Watermark notify */
|
||||
@ -1066,6 +1067,7 @@ static int seq_oneshot(int bustype, int slave, FAR uint16_t *inst,
|
||||
putreg32(1 << (tid + 24), SCU_INT_ENABLE_MAIN);
|
||||
|
||||
scuinfo("Sequencer start.\n");
|
||||
priv->oneshoterr[tid] = 0;
|
||||
|
||||
/* Start sequencer as one shot mode */
|
||||
|
||||
@ -1082,7 +1084,11 @@ static int seq_oneshot(int bustype, int slave, FAR uint16_t *inst,
|
||||
|
||||
scuinfo("Sequencer done.\n");
|
||||
|
||||
if (buffer)
|
||||
if (priv->oneshoterr[tid] < 0)
|
||||
{
|
||||
ret = ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Copy sequencer output results to user buffer.
|
||||
* XXX: Sequencer output RAM offset is differ from document.
|
||||
@ -1661,6 +1667,8 @@ static int seq_scuirqhandler(int irq, FAR void *context, FAR void *arg)
|
||||
uint32_t ierr0;
|
||||
uint32_t ierr1;
|
||||
uint32_t ierr2;
|
||||
uint32_t out;
|
||||
int tid;
|
||||
int i;
|
||||
|
||||
intr = getreg32(SCU_INT_MASKED_STT_MAIN);
|
||||
@ -1721,16 +1729,30 @@ static int seq_scuirqhandler(int irq, FAR void *context, FAR void *arg)
|
||||
if (ierr2 != 0)
|
||||
{
|
||||
scuerr("err2: %08x\n", ierr2);
|
||||
ierr2 &= 0x03ff;
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
{
|
||||
if (ierr2 & (1 << i))
|
||||
if (ierr2 & (0x00010001 << i))
|
||||
{
|
||||
seq_stopseq(i);
|
||||
|
||||
/* Get sequencer output selector */
|
||||
|
||||
out = (getreg32(SCUSEQ_PROPERTY(i)) >> 12) & 0x3;
|
||||
|
||||
if (0 < out)
|
||||
{
|
||||
/* Set error code to oneshot sequencer id */
|
||||
|
||||
tid = out - 1;
|
||||
|
||||
priv->oneshoterr[tid] = -EIO;
|
||||
seq_semgive(&priv->oneshotwait[tid]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
putreg32(0x03ff, SCU_INT_CLEAR_ERR_2);
|
||||
putreg32(ierr2, SCU_INT_CLEAR_ERR_2);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -3461,7 +3483,11 @@ void scu_initialize(void)
|
||||
/* Enable error interrupt */
|
||||
|
||||
putreg32(0x007ffe00, SCU_INT_ENABLE_ERR_0);
|
||||
putreg32(0x03ff, SCU_INT_ENABLE_ERR_2);
|
||||
putreg32(0x03ff03ff, SCU_INT_ENABLE_ERR_2);
|
||||
|
||||
/* Set the number of TxAbort repeat times */
|
||||
|
||||
putreg32(5, SCUSEQ_REPEAT_TXABORT);
|
||||
|
||||
/* Enable SCU IRQ */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user