00001
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 #ifndef _MPU_H_
00049 #define _MPU_H_
00050
00051 #include <avr32/io.h>
00052 #include "compiler.h"
00053
00054
00055 #ifdef AVR32_CORE_SC0_210_H_INCLUDED
00056 #define AVR32_MPUAPRA_AP0_PRIV_R_UNPRIV_NONE 0x00000000
00057 #define AVR32_MPUAPRA_AP0_PRIV_RX_UNPRIV_NONE 0x00000001
00058 #define AVR32_MPUAPRA_AP0_PRIV_RW_UNPRIV_NONE 0x00000002
00059 #define AVR32_MPUAPRA_AP0_PRIV_RX_UNPRIV_RX 0x00000005
00060 #endif
00061
00064 #define MPU_APRA_ID 0
00065 #define MPU_APRB_ID 1
00067
00070 #define MPU_PRIVR_UNPRIVNONE AVR32_MPUAPRA_AP0_PRIV_R_UNPRIV_NONE
00071 #define MPU_PRIVRX_UNPRIVNONE AVR32_MPUAPRA_AP0_PRIV_RX_UNPRIV_NONE
00072 #define MPU_PRIVRW_UNPRIVNONE AVR32_MPUAPRA_AP0_PRIV_RW_UNPRIV_NONE
00073 #define MPU_PRIVRWX_UNPRIVNONE AVR32_MPUAPRA_AP0_PRIV_RWX_UNPRIV_NONE
00074 #define MPU_PRIVR_UNPRIVR AVR32_MPUAPRA_AP0_PRIV_R_UNPRIV_R
00075 #define MPU_PRIVRX_UNPRIVRX AVR32_MPUAPRA_AP0_PRIV_RX_UNPRIV_RX
00076 #define MPU_PRIVRW_UNPRIVRW AVR32_MPUAPRA_AP0_PRIV_RW_UNPRIV_RW
00077 #define MPU_PRIVRWX_UNPRIVRWX AVR32_MPUAPRA_AP0_PRIV_RWX_UNPRIV_RWX
00078 #define MPU_PRIVRW_UNPRIVR AVR32_MPUAPRA_AP0_PRIV_RW_UNPRIV_R
00079 #define MPU_PRIVRW_UNPRIVRX AVR32_MPUAPRA_AP0_PRIV_RW_UNPRIV_RX
00080 #define MPU_PRIVNONE_UNPRIVNONE AVR32_MPUAPRA_AP0_PRIV_NONE_UNPRIV_NONE
00081
00082
00085 #define MPU_SETUP_ENTRY_OK 0
00086 #define MPU_SETUP_ENTRY_INVALIDBASEADDR 1
00087 #define MPU_SETUP_ENTRY_INVALIDSIZE 2
00089
00090
00093 typedef enum
00094 {
00095 MPU_REGION_SIZE_LOWLIMIT_FORBIDDEN= 10,
00096 MPU_REGION_SIZE_4KB,
00097 MPU_REGION_SIZE_8KB,
00098 MPU_REGION_SIZE_16KB,
00099 MPU_REGION_SIZE_32KB,
00100 MPU_REGION_SIZE_64KB,
00101 MPU_REGION_SIZE_128KB,
00102 MPU_REGION_SIZE_256KB,
00103 MPU_REGION_SIZE_512KB,
00104 MPU_REGION_SIZE_1MB,
00105 MPU_REGION_SIZE_2MB,
00106 MPU_REGION_SIZE_4MB,
00107 MPU_REGION_SIZE_8MB,
00108 MPU_REGION_SIZE_16MB,
00109 MPU_REGION_SIZE_32MB,
00110 MPU_REGION_SIZE_64MB,
00111 MPU_REGION_SIZE_128MB,
00112 MPU_REGION_SIZE_256MB,
00113 MPU_REGION_SIZE_512MB,
00114 MPU_REGION_SIZE_1GB,
00115 MPU_REGION_SIZE_2GB,
00116 MPU_REGION_SIZE_4GB,
00117 MPU_REGION_SIZE_HIGHLIMIT_FORBIDDEN
00118 } eRegionSize;
00119
00122 typedef struct {
00123 unsigned int addr;
00124 eRegionSize size;
00125 Bool valid;
00126 } mpu_entry_t;
00127
00128
00129 #define CAST(to, from) \
00130 ({ \
00131 typeof(from) __temp__ = from; \
00132 to = *(typeof(to) *)&__temp__; \
00133 })
00134
00138 extern void enable_mpu(void);
00139
00143 extern void disable_mpu(void);
00144
00155 extern Bool mpu_convert_kbsize_to_eregionsize(eRegionSize *peRegionSizeValue, U32 kBSizeValue);
00156
00165 extern char set_mpu_entry(const mpu_entry_t *mpu_entry, unsigned int region_number);
00166
00172 extern void disable_mpu_entry(unsigned int region_number, unsigned int register_select);
00173
00180 extern void set_access_permissions(unsigned int region_number, unsigned int register_select, unsigned int right_access);
00181
00187 extern void select_subregion(unsigned int region_number, unsigned int pattern_select);
00188
00189
00190 #endif // _MPU_H_