22 #define hw_read__eea , _hw_read_eea
24 #define _hw_read_eea(o,a,addr,...) \
25 _hw_rdeeproma( HW_ADDRESS((o,ar)), \
27 HW_POSITION((o,re)), \
33 HW_INLINE uint8_t _hw_rdeeproma( intptr_t ar,
34 intptr_t cr, uint8_t cb,
38 *(
volatile uint16_t*)ar = a ;
39 *(
volatile uint8_t*)cr |= (1<<cb) ;
40 return *(
volatile uint8_t*) dr ;
55 #define hw_read_bytes__eea , _hw_eea_read_bytes
57 #define _hw_eea_read_bytes(o,a,dst,src,n,...) \
58 _hw_eea_rdn( (uint8_t*)dst, (intptr_t)src, n, \
61 HW_POSITION((o,re)), \
62 HW_ADDRESS((o,dr)) ) \
66 HW_INLINE
void _hw_eea_rdn( uint8_t *dst, intptr_t src, uint8_t n,
68 intptr_t cr, uint8_t cb,
72 *(
volatile uint16_t*)ar = src++ ;
73 *(
volatile uint8_t*)cr |= (1<<cb) ;
74 *dst++ = *(
volatile uint8_t*) dr ;
88 #define hw_write__eea , _hw_write_eea
90 #define _hw_write_eea(o,a,addr,v,...) \
91 _hw_wreeproma( addr, v, \
94 HW_ADDRESS((o,mpe)), HW_POSITION((o,mpe)), \
95 HW_ADDRESS((o,pe)), HW_POSITION((o,pe)) ) \
99 HW_INLINE
void _hw_wreeproma( uint16_t a, uint8_t v,
102 intptr_t mpe_ra, uint8_t mpe_bp,
103 intptr_t pe_ra, uint8_t pe_bp )
107 *(
volatile uint16_t*)ar = a ;
108 *(
volatile uint8_t*)dr = v ;
109 *(
volatile uint8_t*)mpe_ra |= (1U<<mpe_bp) ;
110 *(
volatile uint8_t*)pe_ra |= (1U<<pe_bp) ;
124 #define hw_write_bytes__eea , _hw_eea_write_bytes
126 #define _hw_eea_write_bytes(o,a,dst,src,n,...) \
127 _hw_eea_wrn( (intptr_t)(dst), (uint8_t*)(src), n, \
128 HW_ADDRESS((o,ar)), \
129 HW_ADDRESS((o,dr)), \
130 HW_ADDRESS((o,mpe)), HW_POSITION((o,mpe)), \
131 HW_ADDRESS((o,pe)), HW_POSITION((o,pe)) ) \
135 HW_INLINE
void _hw_eea_wrn ( intptr_t dst,
136 uint8_t *src, uint8_t n,
139 intptr_t mpe_ra, uint8_t mpe_bp,
140 intptr_t pe_ra, uint8_t pe_bp )
148 while ( *(
volatile uint8_t*)pe_ra & (1U<<pe_bp) ) {}
152 *(
volatile uint8_t*)dr = *src++ ;
153 *(
volatile uint16_t*)ar = dst++ ;
154 *(
volatile uint8_t*)mpe_ra |= (1U<<mpe_bp) ;
155 *(
volatile uint8_t*)pe_ra |= (1U<<pe_bp) ;