1 /*
2  * File      : mbox.h
3  * Copyright (c) 2006-2021, RT-Thread Development Team
4  *
5  * SPDX-License-Identifier: Apache-2.0
6  *
7  * Change Logs:
8  * Date           Author         Notes
9  * 2019-08-29     zdzn           first version
10  */
11 
12 #ifndef __MBOX_H__
13 #define __MBOX_H__
14 
15 #include <rtthread.h>
16 #include <stdint.h>
17 /* a properly aligned buffer */
18 extern volatile unsigned int* mbox;
19 
20 #define MBOX_REQUEST    0
21 
22 /* channels */
23 #define MBOX_CH_POWER   0
24 #define MBOX_CH_FB      1
25 #define MBOX_CH_VUART   2
26 #define MBOX_CH_VCHIQ   3
27 #define MBOX_CH_LEDS    4
28 #define MBOX_CH_BTNS    5
29 #define MBOX_CH_TOUCH   6
30 #define MBOX_CH_COUNT   7
31 #define MBOX_CH_PROP    8
32 
33 /* tags */
34 #define MBOX_TAG_SETPOWER       0x28001
35 #define MBOX_TAG_SETCLKRATE     0x38002
36 #define MBOX_GET_MAC_ADDRESS    0x10003
37 #define MBOX_TAG_LAST           0
38 
39 #define MMIO_BASE       0x3F000000
40 #define VIDEOCORE_MBOX  (MMIO_BASE+0x0000B880)
41 #define MBOX_READ       ((volatile unsigned int*)(VIDEOCORE_MBOX+0x0))
42 #define MBOX_POLL       ((volatile unsigned int*)(VIDEOCORE_MBOX+0x10))
43 #define MBOX_SENDER     ((volatile unsigned int*)(VIDEOCORE_MBOX+0x14))
44 #define MBOX_STATUS     ((volatile unsigned int*)(VIDEOCORE_MBOX+0x18))
45 #define MBOX_CONFIG     ((volatile unsigned int*)(VIDEOCORE_MBOX+0x1C))
46 #define MBOX_WRITE      ((volatile unsigned int*)(VIDEOCORE_MBOX+0x20))
47 #define MBOX_RESPONSE   0x80000000
48 #define MBOX_FULL       0x80000000
49 #define MBOX_EMPTY      0x40000000
50 
51 #define DEVICE_ID_SD_CARD   0
52 #define DEVICE_ID_USB_HCD   3
53 #define POWER_STATE_OFF     (0 << 0)
54 #define POWER_STATE_ON      (1 << 0)
55 #define POWER_STATE_WAIT    (1 << 1)
56 #define POWER_STATE_NO_DEVICE   (1 << 1)    // in response
57 #define MMU_ENABLE 1
58 #define MMU_DISABLE 0
59 
60 /*
61  * raspi hardware info
62  */
63 enum {
64     MBOX_TAG_HARDWARE_GET_MODEL         = 0x00010001,
65     MBOX_TAG_HARDWARE_GET_REV           = 0x00010002,
66     MBOX_TAG_HARDWARE_GET_MAC_ADDRESS   = 0x00010003,
67     MBOX_TAG_HARDWARE_GET_SERIAL        = 0x00010004,
68     MBOX_TAG_HARDWARE_GET_ARM_MEMORY    = 0x00010005,
69     MBOX_TAG_HARDWARE_GET_VC_MEMORY     = 0x00010006,
70     MBOX_TAG_HARDWARE_GET_CLOCKS        = 0x00010007,
71 };
72 
73 /*
74  * raspi clock
75  */
76 enum {
77     MBOX_TAG_CLOCK_GET_TURBO    = 0x00030009,
78     MBOX_TAG_CLOCK_SET_TURBO    = 0x00038009,
79     MBOX_TAG_CLOCK_GET_STATE    = 0x00030001,
80     MBOX_TAG_CLOCK_SET_STATE    = 0x00038001,
81     MBOX_TAG_CLOCK_GET_RATE     = 0x00030002,
82     MBOX_TAG_CLOCK_SET_RATE     = 0x00038002,
83     MBOX_TAG_CLOCK_GET_MAX_RATE = 0x00030004,
84     MBOX_TAG_CLOCK_GET_MIN_RATE = 0x00030007,
85 };
86 
87 /*
88  * raspi power
89  */
90 enum {
91     MBOX_TAG_POWER_GET_STATE    = 0x00020001,
92     MBOX_TAG_POWER_SET_STATE    = 0x00028001,
93 };
94 
95 /*
96  * raspi temperature
97  */
98 enum {
99     MBOX_TAG_TEMP_GET       = 0x00030006,
100     MBOX_TAG_TEMP_GET_MAX   = 0x0003000A,
101 };
102 
103 #define MBOX_ADDR 0xc00000
104 
105 int mbox_call(unsigned char ch, int mmu_enable);
106 int bcm283x_mbox_hardware_get_model(void);
107 int bcm283x_mbox_hardware_get_revison(void);
108 int bcm283x_mbox_hardware_get_mac_address(uint8_t * mac);
109 int bcm283x_mbox_hardware_get_serial(rt_uint64_t* sn);
110 int bcm283x_mbox_hardware_get_arm_memory(rt_uint32_t * base, rt_uint32_t * size);
111 int bcm283x_mbox_hardware_get_vc_memory(rt_uint32_t * base, rt_uint32_t * size);
112 int bcm283x_mbox_clock_get_turbo(void);
113 int bcm283x_mbox_clock_set_turbo(int level);
114 int bcm283x_mbox_clock_get_state(int id);
115 int bcm283x_mbox_clock_set_state(int id, int state);
116 int bcm283x_mbox_clock_get_rate(int id);
117 int bcm283x_mbox_clock_set_rate(int id, int rate);
118 int bcm283x_mbox_clock_get_max_rate(int id);
119 int bcm283x_mbox_clock_get_min_rate(int id);
120 int bcm283x_mbox_power_get_state(int id);
121 int bcm283x_mbox_power_set_state(int id, int state);
122 int bcm283x_mbox_temp_get(void);
123 int bcm283x_mbox_temp_get_max(void);
124 
125 #endif
126