cc2538: ccm: Make it possible to use the interrupt
Using the AES interrupt allows the user process not to waste time polling for the completion of the operation. This time can be used by the user process to do something else, or to let the system enter PM0. Since the system is now free to perform various operations during a crypto operation, a protection of the crypto resource is added, and PM1+ is prohibited in order not to stall crypto operations. Signed-off-by: Benoît Thébaudeau <benoit.thebaudeau.dev@gmail.com>
This commit is contained in:
parent
117dc4e5e3
commit
b92a5afcc4
11 changed files with 166 additions and 48 deletions
|
@ -114,6 +114,8 @@ new_hash(sha256_state_t *state, const void *data, void *hash)
|
|||
if(REG(AES_CTRL_INT_STAT) & AES_CTRL_INT_STAT_DMA_BUS_ERR) {
|
||||
/* Clear the DMA error */
|
||||
REG(AES_CTRL_INT_CLR) = AES_CTRL_INT_CLR_DMA_BUS_ERR;
|
||||
/* Disable master control / DMA clock */
|
||||
REG(AES_CTRL_ALG_SEL) = 0x00000000;
|
||||
return CRYPTO_DMA_BUS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -194,6 +196,8 @@ resume_hash(sha256_state_t *state, const void *data, void *hash)
|
|||
if(REG(AES_CTRL_INT_STAT) & AES_CTRL_INT_STAT_DMA_BUS_ERR) {
|
||||
/* Clear the DMA error */
|
||||
REG(AES_CTRL_INT_CLR) = AES_CTRL_INT_CLR_DMA_BUS_ERR;
|
||||
/* Disable master control / DMA clock */
|
||||
REG(AES_CTRL_ALG_SEL) = 0x00000000;
|
||||
return CRYPTO_DMA_BUS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -249,6 +253,10 @@ sha256_process(sha256_state_t *state, const void *data, uint32_t len)
|
|||
return CRYPTO_INVALID_PARAM;
|
||||
}
|
||||
|
||||
if(REG(AES_CTRL_ALG_SEL) != 0x00000000) {
|
||||
return CRYPTO_RESOURCE_IN_USE;
|
||||
}
|
||||
|
||||
if(len > 0 && state->new_digest) {
|
||||
if(state->curlen == 0 && len > BLOCK_SIZE) {
|
||||
rom_util_memcpy(state->buf, data, BLOCK_SIZE);
|
||||
|
@ -321,6 +329,10 @@ sha256_done(sha256_state_t *state, void *hash)
|
|||
return CRYPTO_INVALID_PARAM;
|
||||
}
|
||||
|
||||
if(REG(AES_CTRL_ALG_SEL) != 0x00000000) {
|
||||
return CRYPTO_RESOURCE_IN_USE;
|
||||
}
|
||||
|
||||
/* Increase the length of the message */
|
||||
state->length += state->curlen << 3;
|
||||
state->final_digest = true;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue