HWA
Bare metal programming with style
stka_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 #define hw_class__stka
13 
31 #define hw_configure__stka , _hw_cfstka
32 #define hwa_configure__stka , _hwa_cfstka
33 
34 #define _hw_cfstka(o,a,k,...) do{ HW_B(_hwa_cfstka,k)(_hw,o,k,__VA_ARGS__) }while(0)
35 #define _hwa_cfstka(o,a,k,...) do{ HW_B(_hwa_cfstka,k)(_hwa,o,k,__VA_ARGS__) }while(0)
36 
37 /* At least one keyword
38  */
39 #define _hwa_cfstka1(h,o,k,...) HW_E(HW_EM_AML((clock,reload,run)))
40 #define _hwa_cfstka0(h,o,k,...) HW_BW(_hwa_cfstkack,clock,k)(h,o,k,__VA_ARGS__)
41 
42 /* Optionnal parameter `clock`
43  */
44 #define _hwa_cfstkack1(h,o,k,v,...) HW_BV(_hwa_cfstkack2,cfstkack_,v,h,o,v)(h,o,__VA_ARGS__)//PUSH
45 #define _hwa_cfstkack20(v,...) HW_E(HW_EM_XNIL(v,(ahb, ahb/8)))
46 #define _hwa_cfstkack21(r,h,o,v) \
47  if ( 8*r == 1 ) h##_write(o,clksource,0); \
48  else if ( r == 1 ) h##_write(o,clksource,1); \
49  else HWA_E(HW_EM_VAL(v,clock,(ahb/8, ahb))); \
50  _hwa_cfstkack0 //POP
51 
52 #define _hw_cfstkack_ahb , 1
53 
54 /* Optionnal parameter `reload`
55  */
56 #define _hwa_cfstkack0(h,o,k,...) HW_BW(_hwa_cfstkald,reload,k)(h,o,k,__VA_ARGS__)
57 #define _hwa_cfstkald1(h,o,ok,v,k,...) \
58  h##_write(o,reload,(uint32_t)(v)); \
59  HW_BW(_hwa_cfstkarn,run,k)(h,o,k,__VA_ARGS__)
60 
61 #define _hwa_cfstkald0(h,o,k,...) HW_BW(_hwa_cfstkarn,run,k)(h,o,k,__VA_ARGS__)
62 
63 /* Optionnal parameter `run`
64  */
65 #define _hwa_cfstkarn0(h,o,...) HW_EOL(__VA_ARGS__)
66 #define _hwa_cfstkarn1(h,o,k,v,...) HW_BV(_hwa_cfstkarn1,state_,v,h,o)(__VA_ARGS__)//PUSH
67 #define _hwa_cfstkarn10(v,...) HW_E(HW_EM_ST(v))
68 #define _hwa_cfstkarn11(r,n,h,o) h##_write(o,enable,r); HW_EOL //POP
69 
70 
80 #define hw_turn__stka , _hw_tnstka
81 #define _hw_tnstka(o,a,...) do{ _hwx_tnstka(_hw,o,__VA_ARGS__) }while(0)
82 
83 #define hwa_turn__stka , _hwa_tnstka
84 #define _hwa_tnstka(o,a,...) do{ _hwx_tnstka(_hwa,o,__VA_ARGS__) }while(0)
85 
86 #define _hwx_tnstka(h,o,v,...) HW_BV(_hwx_tnstka_,state_,v,h,o)(__VA_ARGS__)//PUSH
87 #define _hwx_tnstka_0(v,...) HW_E(HW_EM_ST(v))
88 #define _hwx_tnstka_1(r,n,h,o) h##_write(o,enable,r); HW_EOL//POP
89 
90 
100 #define hw_read__stka , _hw_rdstka
101 #define _hw_rdstka(o,a,...) _hw_read(o,current)
102 
103 
104 /*******************************************************************************
105  * *
106  * Context management *
107  * *
108  *******************************************************************************/
109 
110 #define _hwa_setup__stka(o,a) \
111  _hwa_setup_r( o, ctrl ); \
112  _hwa_setup_r( o, load ); \
113  _hwa_setup_r( o, val )
114 
115 #define _hwa_init__stka(o,a) \
116  _hwa_init_r( o, ctrl, 0x00000000 ); \
117  _hwa_init_r( o, load, 0x00000000 ); \
118  _hwa_init_r( o, val, 0x00000000 )
119 
120 #define _hwa_commit__stka(o,a) \
121  _hwa_commit_r( o, ctrl ); \
122  _hwa_commit_r( o, load ); \
123  _hwa_commit_r( o, val )