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
00057 #define MPU_APRA_ID 0
00058 #define MPU_APRB_ID 1
00060
00063 #define MPU_PRIVR_UNPRIVNONE AVR32_MPUAPRA_AP0_PRIV_R_UNPRIV_NONE
00064 #define MPU_PRIVRX_UNPRIVNONE AVR32_MPUAPRA_AP0_PRIV_RX_UNPRIV_NONE
00065 #define MPU_PRIVRW_UNPRIVNONE AVR32_MPUAPRA_AP0_PRIV_RW_UNPRIV_NONE
00066 #define MPU_PRIVRWX_UNPRIVNONE AVR32_MPUAPRA_AP0_PRIV_RWX_UNPRIV_NONE
00067 #define MPU_PRIVR_UNPRIVR AVR32_MPUAPRA_AP0_PRIV_R_UNPRIV_R
00068 #define MPU_PRIVRX_UNPRIVRX AVR32_MPUAPRA_AP0_PRIV_RX_UNPRIV_RX
00069 #define MPU_PRIVRW_UNPRIVRW AVR32_MPUAPRA_AP0_PRIV_RW_UNPRIV_RW
00070 #define MPU_PRIVRWX_UNPRIVRWX AVR32_MPUAPRA_AP0_PRIV_RWX_UNPRIV_RWX
00071 #define MPU_PRIVRW_UNPRIVR AVR32_MPUAPRA_AP0_PRIV_RW_UNPRIV_R
00072 #define MPU_PRIVRW_UNPRIVRX AVR32_MPUAPRA_AP0_PRIV_RW_UNPRIV_RX
00073 #define MPU_PRIVNONE_UNPRIVNONE AVR32_MPUAPRA_AP0_PRIV_NONE_UNPRIV_NONE
00074
00075
00078 #define MPU_SETUP_ENTRY_OK 0
00079 #define MPU_SETUP_ENTRY_INVALIDBASEADDR 1
00080 #define MPU_SETUP_ENTRY_INVALIDSIZE 2
00082
00083
00086 typedef enum
00087 {
00088 MPU_REGION_SIZE_LOWLIMIT_FORBIDDEN= 10,
00089 MPU_REGION_SIZE_4KB,
00090 MPU_REGION_SIZE_8KB,
00091 MPU_REGION_SIZE_16KB,
00092 MPU_REGION_SIZE_32KB,
00093 MPU_REGION_SIZE_64KB,
00094 MPU_REGION_SIZE_128KB,
00095 MPU_REGION_SIZE_256KB,
00096 MPU_REGION_SIZE_512KB,
00097 MPU_REGION_SIZE_1MB,
00098 MPU_REGION_SIZE_2MB,
00099 MPU_REGION_SIZE_4MB,
00100 MPU_REGION_SIZE_8MB,
00101 MPU_REGION_SIZE_16MB,
00102 MPU_REGION_SIZE_32MB,
00103 MPU_REGION_SIZE_64MB,
00104 MPU_REGION_SIZE_128MB,
00105 MPU_REGION_SIZE_256MB,
00106 MPU_REGION_SIZE_512MB,
00107 MPU_REGION_SIZE_1GB,
00108 MPU_REGION_SIZE_2GB,
00109 MPU_REGION_SIZE_4GB,
00110 MPU_REGION_SIZE_HIGHLIMIT_FORBIDDEN
00111 } eRegionSize;
00112
00115 typedef struct {
00116 unsigned int addr;
00117 eRegionSize size;
00118 Bool valid;
00119 } mpu_entry_t;
00120
00121
00122 #define CAST(to, from) \
00123 ({ \
00124 typeof(from) __temp__ = from; \
00125 to = *(typeof(to) *)&__temp__; \
00126 })
00127
00131 extern void enable_mpu(void);
00132
00136 extern void disable_mpu(void);
00137
00148 extern Bool mpu_convert_kbsize_to_eregionsize(eRegionSize *peRegionSizeValue, U32 kBSizeValue);
00149
00158 extern char set_mpu_entry(const mpu_entry_t *mpu_entry, unsigned int region_number);
00159
00165 extern void disable_mpu_entry(unsigned int region_number, unsigned int register_select);
00166
00173 extern void set_access_permissions(unsigned int region_number, unsigned int register_select, unsigned int right_access);
00174
00180 extern void select_subregion(unsigned int region_number, unsigned int pattern_select);
00181
00182
00183 #endif // _MPU_H_