f5bc5391583a9aad79663e8569d6c140ba135423
[cortex-from-scratch] / lib / regfunc.c
1 /* (CC-BY-NC-SA) ROBIN KRENS - ROBIN @ ROBINKRENS.NL
2  * 
3  * $LOG$
4  * 2019/7/20 - ROBIN KRENS      
5  * Initial version 
6  * 
7  * $DESCRIPTION$
8  * Helper functions to set registers 
9  *
10  * */
11
12 #include <stdbool.h>
13 #include <stddef.h>
14 #include <stdint.h>
15
16 #include <lib/regfunc.h>
17 #include <lib/string.h>
18 #include <lib/stdio.h>
19
20 #include <sys/mmap.h>
21
22
23 // register set bit at position
24 void rsetbit(volatile uint32_t * reg, short pos) {
25         *reg = *reg | (0x1 << pos);
26 }
27
28 // register set bits from certain pos
29 void rsetbitsfrom(volatile uint32_t * reg, short pos, int val) {
30         *reg = *reg | (val << pos);
31 }
32
33 // register clear bit at position
34 void rclrbit(volatile uint32_t * reg, short pos) {
35         *reg = *reg & ~(0x1 << pos);
36 }
37
38 // check if a bit is set 
39 int rchkbit(volatile uint32_t * reg, short pos) {
40         if ((*reg >> pos) & 0x1)
41                 return 1;
42         return 0;
43 }
44
45 // register (over)write
46 void rwrite(volatile uint32_t * reg, uint32_t val) {
47         *reg = val;
48 }
49
50
51 /* DEPRECATED write value (uint8_t) to register 
52 void regw_u8(volatile uint32_t * reg, uint8_t val, short shift, short flag) {
53
54         switch(flag) {
55                 case OWRITE:
56                         *reg = (val << shift);
57                         break;
58                 case SETBIT:
59                         *reg = *reg | (val << shift);
60                         break;
61                 case CLRBIT:
62                         *reg = *reg & ~(val << shift);
63                         break;
64         }
65 } */
66
67 /* DEPRECATED write value (uint32_t) to register 
68 void regw_u32(volatile uint32_t * reg, uint32_t val, short shift, short flag) {
69
70         switch(flag) {
71                 case OWRITE:
72                         *reg = (val << shift);
73                         break;
74                 case SETBIT:
75                         *reg = *reg | (val << shift);
76                         break;
77                 case CLRBIT:
78                         *reg = *reg & ~(val << shift);
79                         break;
80         }
81 } */
82
83 /* Deprecated use printf instead
84 char hexbuf[8];
85 char * regtohex(uint32_t addr) {
86         char tmpbuf[6] = {'A', 'B', 'C', 'D', 'E', 'F'};
87         memset(&hexbuf, 0, sizeof(uint32_t) * 8);
88
89
90         for (int i = 0; i < 8 ; i++) {
91                 uint32_t tmp = addr;
92                 tmp = tmp >> (28 - (i * 4));
93                 tmp = tmp & 0xF;
94                 if ((tmp >= 0) && tmp < 10) {
95                         hexbuf[i] = (char) tmp + 48;
96                 }
97                 else {
98                         hexbuf[i] = tmpbuf[tmp - 10];
99                 }
100         }
101         return &hexbuf[0];      
102 } */
103
104 // TODO: implement simple scanf functions
105 int singlehextoreg(char  hex) {
106
107         int conv = 0;
108         if (hex >= 'A' && hex <= 'F') 
109                 conv = hex - '7';
110
111         else {
112                 conv = hex - '0';
113         }
114         return conv;
115
116 }
117
118 uint32_t hextoreg(char * a) {
119         
120         uint32_t x = 0;
121         int tmp;
122         for(int i = 0; i < 8; i++) {
123                 tmp = singlehextoreg(*a++);
124                 x += tmp << (28 - (i * 4));
125         }
126         return x;
127
128 }
129