HWA
Bare metal programming with style
gpa_2.h
Go to the documentation of this file.
1 
2 /* This file is part of the HWA project.
3  * Copyright (c) 2017 Christophe Duparquet.
4  * All rights reserved. Read LICENSE.TXT for details.
5  */
6 
12 /* Load pins interface definitions
13  */
14 #include "ioa_2.h"
15 
28 /*******************************************************************************
29  * *
30  * Context management *
31  * *
32  *******************************************************************************/
33 
34 #define _hwa_setup__gpa(o,a) \
35  _hwa_setup_r( o, crl ); \
36  _hwa_setup_r( o, crh ); \
37  _hwa_setup_r( o, odr ); \
38  _hwa_setup_r( o, bsrr ); \
39  _hwa_setup_r( o, brr ); \
40  _hwa_setup_r( o, lckr ); \
41  hwa->o.toggles = 0
42 
43 #define _hwa_init__gpa(o,a) \
44  _hwa_init_r( o, crl, 0x44444444 ); \
45  _hwa_init_r( o, crh, 0x44444444 ); \
46  _hwa_init_r( o, odr, 0x00000000 ); \
47  _hwa_init_r( o, bsrr, 0x00000000 ); \
48  _hwa_init_r( o, brr, 0x00000000 ); \
49  _hwa_init_r( o, lckr, 0x00000000 )
50 
51 #define _hwa_commit__gpa(o,a) \
52  _hwa_commit_r( o, crl ); \
53  _hwa_commit_r( o, crh ); \
54  _hwa_commit_r( o, odr ); \
55  _hwa_commit_r( o, bsrr ); \
56  _hwa_commit_r( o, brr ); \
57  _hwa_commit_r( o, lckr ); \
58  _hwa_commit_toggles( &hwa->o )
59 
60 
61 /* Toggle pins
62  */
63 HW_INLINE void _hwa_commit_toggles ( hwa_gpa_t *o )
64 {
65  if ( o->toggles ) {
66  volatile uint32_t *odr = (volatile uint32_t*)o->odr.a;
67 
68  if ( (o->odr.omask & 0xffff) != 0xffff ) {
69  o->odr.ovalue = *odr ;
70  o->odr.omask = 0xffff ;
71  }
72  o->odr.ovalue ^= o->toggles ;
73 
74  /* *odr = o->odr.ovalue ; DO NOT WRITE THE ODR! */
75  volatile uint32_t *bsrr = (volatile uint32_t*)o->bsrr.a;
76  *bsrr = (o->toggles & ~o->odr.ovalue)<<16 | (o->toggles & o->odr.ovalue);
77 
78  /* Reset the BSRR to 0
79  */
80  o->bsrr.ovalue = 0;
81  o->bsrr.omask = 0xffffffff ;
82  o->bsrr.mmask = 0 ;
83 
84  o->toggles = 0 ;
85  }
86 }
ioa_2.h
I/O.