startup and debug led
[rpikern] / src / main.c
1 /* mailbox registers (MB 0: input  1: output)
2  * function | MB 0 | MB 1
3  *  rd/wr   | 00   | 20      ( upper 28: data, lower 4: channel )
4  *  peek    | 10   | 30
5  *  sender  | 14   | 34
6  *  status  | 18   | 38
7  *  config  | 1c   | 3c
8  *
9  * channel 1: framebuffer
10  * channel 8: request
11  *
12  * read: read status reg loop while empty flag is set
13  * write: read status loop while full flag is set
14  */
15 #include <string.h>
16 #include <stdint.h>
17
18 #ifdef RPI1
19 #define IOBASEADDR      0x20000000
20 #else
21 #define IOBASEADDR      0x3f000000
22 #endif
23
24 #define phys2bus(addr)  ((addr) | 0x40000000)
25 #define bus2phys(addr)  ((addr) & 0x3fffffff)
26
27 #define IOREG_ADDR(x)   (IOBASEADDR | (x))
28 #define REG_MB_READ             *((volatile uint32_t*)IOREG_ADDR(0xb880))
29 #define REG_MB_STAT             *((volatile uint32_t*)IOREG_ADDR(0xb898))
30 #define REG_MB_WRITE    *((volatile uint32_t*)IOREG_ADDR(0xb8a0))
31
32 #define MB_STAT_FULL    0x80000000
33 #define MB_STAT_EMPTY   0x40000000
34
35 #define MB_CHAN_FRAMEBUF        1
36 #define MB_CHAN_PROP            8
37
38 #define PROP_CODE_REQ   0
39 #define PROP_RESP_OK    0x80000000
40
41 #define PROP_TAG_END            0
42 #define PROP_TAG_BLANKSCR       0x40002
43
44 int prop_blankscr(int onoff);
45
46 uint32_t mb_read(int chan);
47 void mb_write(int chan, uint32_t val);
48
49 int main(void)
50 {
51         prop_blankscr(1);
52
53         return 0;
54 }
55
56 static uint32_t propbuf[64] __attribute__((aligned(16)));
57
58 int prop_blankscr(int onoff)
59 {
60         uint32_t *pb = propbuf;
61
62         *pb++ = 0;
63         *pb++ = 0;
64         *pb++ = PROP_TAG_BLANKSCR;
65         *pb++ = 4;      /* data size */
66         *pb++ = PROP_CODE_REQ;
67         *pb++ = onoff ? 1 : 0;
68         *pb++ = PROP_TAG_END;
69         *pb++ = 0;      /* padding */
70         propbuf[0] = (char*)pb - (char*)propbuf;
71
72         mb_write(MB_CHAN_PROP, (uint32_t)propbuf >> 4);
73         mb_read(MB_CHAN_PROP);
74
75         return propbuf[1] == PROP_RESP_OK ? 0 : -1;
76 }
77
78 uint32_t mb_read(int chan)
79 {
80         uint32_t val;
81         do {
82                 while(REG_MB_STAT & MB_STAT_EMPTY);
83                 val = REG_MB_READ;
84         } while((val & 0xf) != chan);
85         return val >> 4;
86 }
87
88 void mb_write(int chan, uint32_t val)
89 {
90         while(REG_MB_STAT & MB_STAT_FULL);
91         REG_MB_WRITE = (val << 4) | chan;
92 }