2.2.4.6 Programmable IO Controller (PIOC)

The PIO controller memory map is split in two parts: the lower 4 Kbytes are never secure, while the upper part is always secure. Each IO line can be configured as secure or non-secure. Once configured as secure in the secure part registers, only the Secure world can reprogram the corresponding IO. It is not possible to reconfigure a secure IO by modifying the non-secure part registers as long as this IO is set as secure.

Interrupts related to events on secure IOs are transmitted on secure lines (ID_PIO*_SINT). Non-secure IO events are transmitted on non-secure interrupt lines (ID_PIO*). The GIC must be configured in order to associate the secure interrupt lines to the secure interrupts group.

Table 2-14. PIO Controller Security Settings
Peripheral IDTypeSecurity
ID_PIOAUser interface interrupt ID

Secure except the first 4 Kbytes (Non-secure).

The interrupt targets Non-secure world (1).

ID_PIOBInterrupt ID onlyNon-secure
ID_PIOCInterrupt ID onlyNon-secure
ID_PIODInterrupt ID onlyNon-secure
ID_PIOEInterrupt ID onlyNon-secure
ID_PIOA_SINTInterrupt ID only Secure
ID_PIOB_SINTInterrupt ID only Secure
ID_PIOC_SINTInterrupt ID only Secure
ID_PIOD_SINTInterrupt ID only Secure
ID_PIOE_SINTInterrupt ID only Secure
Note: The ID_PIOA security bit value is 'secure', whereas the corresponding interrupt ID_PIOA is dedicated to the Non-secure world. ID_PIOA must be secure so that the PIO memory map is secure above 4 Kbytes (a mechanism implemented in HBridge). The security bit value of peripheral IDs can conflict with the security level of interrupt IDs. In such case, the peripheral security level always prevails.

Refer to the section Parallel Input/Output Controller (PIO) for more details.