summaryrefslogtreecommitdiff
path: root/doc/protocols/ihu-cpu.txt
blob: fad1ffa929e187bf02feecda10463961ae6c4fa8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
Protocol Definition between IHU and CPU
=======================================


Introduction
------------

The two controllers use SPI to communicate with each other. In
addition to the 4 Lines needed for SPI there are 2 extra connections
between IHU and CPU. One is for the IHU to reset the CPU. Holding
this pin low prevents the CPU from running and therefore keeps
power consumption at a minimum, after a low to high transition the CPU
has to perform a hardware reset.
The second line is used by the CPU to inform the IHU that it wishes
to communicate. After this line goes high the IHU has to start the
communication by starting the SPI clock.


Frames
------

The following chart shows a single frame which is used for communication

Field-length:  1      1      1        LEN          1
            +------+------+------+--------------+------+
Name        | 0xAA | MSG  | LEN  |    DATA      | CS   |
            +------+------+------+--------------+------+

Every message frame starts with 0xAA followed by a message code and
the length of the following DATA field. The length field might be zero
if the message doesn't need any additional data. The last byte of every
frame contains a checksum. It is calculated by XORing every variable byte
of the message. In a message N bytes long, where Byte 1 is the first and Byte
N the last Byte, CS is calculated starting with Byte 2 (MSG) and ending
with Byte N-1 (last DATA Byte)
The minimum frame length is 4 Bytes and the maximum is 260 Bytes.
The bytes have to be sent LSB first. Multi byte fields have to be sent
in Little-Endian format.


Messages
--------

Messages are separated in request and responses. Requests use upper case
letters and replies use lower case.

 'F' - Finish up (IHU -> CPU)
 ~~~~~~~~~~~~~~~

 Sent by the IHU.

 This command tells the CPU that the IHU is planning to shut down
 the CPU after ?? ms. The CPU has to write pending flash pages and put
 payload hardware into deep sleep. After finishing everything up the CPU
 has to go into power down.
 This command doesn't send any data.

 Expected response: 'f'


 'P' - Ping, Time and Power Budget (IHU -> CPU)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 This command is sent by the IHU every minute (??) and contains the
 following data:

  2Bytes Power Budget (see Power Management for details)
  4Bytes Timestamp (seconds since EPOCH)

 Expected response: 'p'


 'T' - Get Time (CPU -> IHU)
 ~~~~~~~~~~~~~~

 This command requests the current time.

 Expected response: 't'



 'f' - Ack to finish up (CPU -> IHU)
 ~~~~~~~~~~~~~~~~~~~~~~

 Sent as an acknowledge to a received 'F'.


 'p' - Ack to finish up (CPU -> IHU)
 ~~~~~~~~~~~~~~~~~~~~~~

 Sent as an acknowledge to a received 'P'.


 't' - Get Time (IHU -> CPU)
 ~~~~~~~~~~~~~~

 Sends the current Timestamp after receiving a 'T' request.
 This message sends the 4 Byte Timestamp (seconds since EPOCH)
 as data.


Example Communication
---------------------

IHU sends a Ping to CPU, telling it that the current power
budget is 2424 units of power and the current time is
1305501574 seconds since epoch. The CPU acknowledges the
message.

IHU->CPU:  0xAA 'P' 0x06 0x09 0x78 0x4d 0xd0 0x5f 0x86 0x63
CPU->IHU:  0xAA 'p' 0x00 0x70


Power Management
----------------

FIXME



Notes
-----

EPOCH is the arbitrary point in time where Timestamp is 0x00000000.
(depending on choice of RTC, probably 1970-01-01 00:00)