PD Buddy Sink Firmware
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

pd.h 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. /*
  2. * PD Buddy Firmware Library - USB Power Delivery for everyone
  3. * Copyright 2017-2018 Clayton G. Hobbs
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. */
  17. #ifndef PDB_PD_H
  18. #define PDB_PD_H
  19. #include <stdint.h>
  20. #include <ch.h>
  21. /*
  22. * Macros for working with USB Power Delivery messages.
  23. *
  24. * This file is mostly written from the PD Rev. 2.0 spec, but the header is
  25. * written from the Rev. 3.0 spec.
  26. */
  27. /*
  28. * PD Header
  29. */
  30. #define PD_HDR_MSGTYPE_SHIFT 0
  31. #define PD_HDR_MSGTYPE (0x1F << PD_HDR_MSGTYPE_SHIFT)
  32. #define PD_HDR_DATAROLE_SHIFT 5
  33. #define PD_HDR_DATAROLE (0x1 << PD_HDR_DATAROLE_SHIFT)
  34. #define PD_HDR_SPECREV_SHIFT 6
  35. #define PD_HDR_SPECREV (0x3 << PD_HDR_SPECREV_SHIFT)
  36. #define PD_HDR_POWERROLE_SHIFT 8
  37. #define PD_HDR_POWERROLE (1 << PD_HDR_POWERROLE_SHIFT)
  38. #define PD_HDR_MESSAGEID_SHIFT 9
  39. #define PD_HDR_MESSAGEID (0x7 << PD_HDR_MESSAGEID_SHIFT)
  40. #define PD_HDR_NUMOBJ_SHIFT 12
  41. #define PD_HDR_NUMOBJ (0x7 << PD_HDR_NUMOBJ_SHIFT)
  42. #define PD_HDR_EXT (1 << 15)
  43. /* Message types */
  44. #define PD_MSGTYPE_GET(msg) (((msg)->hdr & PD_HDR_MSGTYPE) >> PD_HDR_MSGTYPE_SHIFT)
  45. /* Control Message */
  46. #define PD_MSGTYPE_GOODCRC 0x01
  47. #define PD_MSGTYPE_GOTOMIN 0x02
  48. #define PD_MSGTYPE_ACCEPT 0x03
  49. #define PD_MSGTYPE_REJECT 0x04
  50. #define PD_MSGTYPE_PING 0x05
  51. #define PD_MSGTYPE_PS_RDY 0x06
  52. #define PD_MSGTYPE_GET_SOURCE_CAP 0x07
  53. #define PD_MSGTYPE_GET_SINK_CAP 0x08
  54. #define PD_MSGTYPE_DR_SWAP 0x09
  55. #define PD_MSGTYPE_PR_SWAP 0x0A
  56. #define PD_MSGTYPE_VCONN_SWAP 0x0B
  57. #define PD_MSGTYPE_WAIT 0x0C
  58. #define PD_MSGTYPE_SOFT_RESET 0x0D
  59. #define PD_MSGTYPE_NOT_SUPPORTED 0x10
  60. #define PD_MSGTYPE_GET_SOURCE_CAP_EXTENDED 0x11
  61. #define PD_MSGTYPE_GET_STATUS 0x12
  62. #define PD_MSGTYPE_FR_SWAP 0x13
  63. #define PD_MSGTYPE_GET_PPS_STATUS 0x14
  64. #define PD_MSGTYPE_GET_COUNTRY_CODES 0x15
  65. /* Data Message */
  66. #define PD_MSGTYPE_SOURCE_CAPABILITIES 0x01
  67. #define PD_MSGTYPE_REQUEST 0x02
  68. #define PD_MSGTYPE_BIST 0x03
  69. #define PD_MSGTYPE_SINK_CAPABILITIES 0x04
  70. #define PD_MSGTYPE_BATTERY_STATUS 0x05
  71. #define PD_MSGTYPE_ALERT 0x06
  72. #define PD_MSGTYPE_GET_COUNTRY_INFO 0x07
  73. #define PD_MSGTYPE_VENDOR_DEFINED 0x0F
  74. /* Extended Message */
  75. #define PD_MSGTYPE_SOURCE_CAPABILITIES_EXTENDED 0x01
  76. #define PD_MSGTYPE_STATUS 0x02
  77. #define PD_MSGTYPE_GET_BATTERY_CAP 0x03
  78. #define PD_MSGTYPE_GET_BATTERY_STATUS 0x04
  79. #define PD_MSGTYPE_BATTERY_CAPABILITIES 0x05
  80. #define PD_MSGTYPE_GET_MANUFACTURER_INFO 0x06
  81. #define PD_MSGTYPE_MANUFACTURER_INFO 0x07
  82. #define PD_MSGTYPE_SECURITY_REQUEST 0x08
  83. #define PD_MSGTYPE_SECURITY_RESPONSE 0x09
  84. #define PD_MSGTYPE_FIRMWARE_UPDATE_REQUEST 0x0A
  85. #define PD_MSGTYPE_FIRMWARE_UPDATE_RESPONSE 0x0B
  86. #define PD_MSGTYPE_PPS_STATUS 0x0C
  87. #define PD_MSGTYPE_COUNTRY_INFO 0x0D
  88. #define PD_MSGTYPE_COUNTRY_CODES 0x0E
  89. /* Data roles */
  90. #define PD_DATAROLE_UFP (0x0 << PD_HDR_DATAROLE_SHIFT)
  91. #define PD_DATAROLE_DFP (0x1 << PD_HDR_DATAROLE_SHIFT)
  92. /* Specification revisions */
  93. #define PD_SPECREV_1_0 (0x0 << PD_HDR_SPECREV_SHIFT)
  94. #define PD_SPECREV_2_0 (0x1 << PD_HDR_SPECREV_SHIFT)
  95. #define PD_SPECREV_3_0 (0x2 << PD_HDR_SPECREV_SHIFT)
  96. /* Port power roles */
  97. #define PD_POWERROLE_SINK (0x0 << PD_HDR_POWERROLE_SHIFT)
  98. #define PD_POWERROLE_SOURCE (0x1 << PD_HDR_POWERROLE_SHIFT)
  99. /* Message ID */
  100. #define PD_MESSAGEID_GET(msg) (((msg)->hdr & PD_HDR_MESSAGEID) >> PD_HDR_MESSAGEID_SHIFT)
  101. /* Number of data objects */
  102. #define PD_NUMOBJ(n) (((n) << PD_HDR_NUMOBJ_SHIFT) & PD_HDR_NUMOBJ)
  103. #define PD_NUMOBJ_GET(msg) (((msg)->hdr & PD_HDR_NUMOBJ) >> PD_HDR_NUMOBJ_SHIFT)
  104. /*
  105. * PD Extended Message Header
  106. */
  107. #define PD_EXTHDR_DATA_SIZE_SHIFT 0
  108. #define PD_EXTHDR_DATA_SIZE (0x1FF << PD_EXTHDR_DATA_SIZE_SHIFT)
  109. #define PD_EXTHDR_REQUEST_CHUNK_SHIFT 10
  110. #define PD_EXTHDR_REQUEST_CHUNK (1 << PD_EXTHDR_REQUEST_CHUNK_SHIFT)
  111. #define PD_EXTHDR_CHUNK_NUMBER_SHIFT 11
  112. #define PD_EXTHDR_CHUNK_NUMBER (0xF << PD_EXTHDR_CHUNK_NUMBER_SHIFT)
  113. #define PD_EXTHDR_CHUNKED_SHIFT 15
  114. #define PD_EXTHDR_CHUNKED (1 << PD_EXTHDR_CHUNKED_SHIFT)
  115. /* Data size */
  116. #define PD_DATA_SIZE(n) (((n) << PD_EXTHDR_DATA_SIZE_SHIFT) & PD_EXTHDR_DATA_SIZE)
  117. #define PD_DATA_SIZE_GET(msg) (((msg)->exthdr & PD_EXTHDR_DATA_SIZE) >> PD_EXTHDR_DATA_SIZE_SHIFT)
  118. /* Chunk number */
  119. #define PD_CHUNK_NUMBER(n) (((n) << PD_EXTHDR_CHUNK_NUMBER_SHIFT) & PD_EXTHDR_CHUNK_NUMBER)
  120. #define PD_CHUNK_NUMBER_GET(msg) (((msg)->exthdr & PD_EXTHDR_CHUNK_NUMBER) >> PD_EXTHDR_CHUNK_NUMBER_SHIFT)
  121. /*
  122. * PD Power Data Object
  123. */
  124. #define PD_PDO_TYPE_SHIFT 30
  125. #define PD_PDO_TYPE (0x3 << PD_PDO_TYPE_SHIFT)
  126. /* PDO types */
  127. #define PD_PDO_TYPE_FIXED ((unsigned) (0x0 << PD_PDO_TYPE_SHIFT))
  128. #define PD_PDO_TYPE_BATTERY ((unsigned) (0x1 << PD_PDO_TYPE_SHIFT))
  129. #define PD_PDO_TYPE_VARIABLE ((unsigned) (0x2 << PD_PDO_TYPE_SHIFT))
  130. #define PD_PDO_TYPE_AUGMENTED ((unsigned) (0x3 << PD_PDO_TYPE_SHIFT))
  131. #define PD_APDO_TYPE_SHIFT 28
  132. #define PD_APDO_TYPE (0x3 << PD_APDO_TYPE_SHIFT)
  133. /* APDO types */
  134. #define PD_APDO_TYPE_PPS (0x0 << PD_APDO_TYPE_SHIFT)
  135. /* PD Source Fixed PDO */
  136. #define PD_PDO_SRC_FIXED_DUAL_ROLE_PWR_SHIFT 29
  137. #define PD_PDO_SRC_FIXED_DUAL_ROLE_PWR (1 << PD_PDO_SRC_FIXED_DUAL_ROLE_PWR_SHIFT)
  138. #define PD_PDO_SRC_FIXED_USB_SUSPEND_SHIFT 28
  139. #define PD_PDO_SRC_FIXED_USB_SUSPEND (1 << PD_PDO_SRC_FIXED_USB_SUSPEND_SHIFT)
  140. #define PD_PDO_SRC_FIXED_UNCONSTRAINED_SHIFT 27
  141. #define PD_PDO_SRC_FIXED_UNCONSTRAINED (1 << PD_PDO_SRC_FIXED_UNCONSTRAINED_SHIFT)
  142. #define PD_PDO_SRC_FIXED_USB_COMMS_SHIFT 26
  143. #define PD_PDO_SRC_FIXED_USB_COMMS (1 << PD_PDO_SRC_FIXED_USB_COMMS_SHIFT)
  144. #define PD_PDO_SRC_FIXED_DUAL_ROLE_DATA_SHIFT 25
  145. #define PD_PDO_SRC_FIXED_DUAL_ROLE_DATA (1 << PD_PDO_SRC_FIXED_DUAL_ROLE_DATA_SHIFT)
  146. #define PD_PDO_SRC_FIXED_UNCHUNKED_EXT_MSG_SHIFT 24
  147. #define PD_PDO_SRC_FIXED_UNCHUNKED_EXT_MSG (1 << PD_PDO_SRC_FIXED_UNCHUNKED_EXT_MSG_SHIFT)
  148. #define PD_PDO_SRC_FIXED_PEAK_CURRENT_SHIFT 20
  149. #define PD_PDO_SRC_FIXED_PEAK_CURRENT (0x3 << PD_PDO_SRC_FIXED_PEAK_CURRENT_SHIFT)
  150. #define PD_PDO_SRC_FIXED_VOLTAGE_SHIFT 10
  151. #define PD_PDO_SRC_FIXED_VOLTAGE (0x3FF << PD_PDO_SRC_FIXED_VOLTAGE_SHIFT)
  152. #define PD_PDO_SRC_FIXED_CURRENT_SHIFT 0
  153. #define PD_PDO_SRC_FIXED_CURRENT (0x3FF << PD_PDO_SRC_FIXED_CURRENT_SHIFT)
  154. /* PD Source Fixed PDO current */
  155. #define PD_PDO_SRC_FIXED_CURRENT_GET(pdo) (((pdo) & PD_PDO_SRC_FIXED_CURRENT) >> PD_PDO_SRC_FIXED_CURRENT_SHIFT)
  156. /* PD Source Fixed PDO voltage */
  157. #define PD_PDO_SRC_FIXED_VOLTAGE_GET(pdo) (((pdo) & PD_PDO_SRC_FIXED_VOLTAGE) >> PD_PDO_SRC_FIXED_VOLTAGE_SHIFT)
  158. /* PD Programmable Power Supply APDO */
  159. #define PD_APDO_PPS_MAX_VOLTAGE_SHIFT 17
  160. #define PD_APDO_PPS_MAX_VOLTAGE (0xFF << PD_APDO_PPS_MAX_VOLTAGE_SHIFT)
  161. #define PD_APDO_PPS_MIN_VOLTAGE_SHIFT 8
  162. #define PD_APDO_PPS_MIN_VOLTAGE (0xFF << PD_APDO_PPS_MIN_VOLTAGE_SHIFT)
  163. #define PD_APDO_PPS_CURRENT_SHIFT 0
  164. #define PD_APDO_PPS_CURRENT (0x7F << PD_APDO_PPS_CURRENT_SHIFT)
  165. /* PD Programmable Power Supply APDO voltages */
  166. #define PD_APDO_PPS_MAX_VOLTAGE_GET(pdo) (((pdo) & PD_APDO_PPS_MAX_VOLTAGE) >> PD_APDO_PPS_MAX_VOLTAGE_SHIFT)
  167. #define PD_APDO_PPS_MIN_VOLTAGE_GET(pdo) (((pdo) & PD_APDO_PPS_MIN_VOLTAGE) >> PD_APDO_PPS_MIN_VOLTAGE_SHIFT)
  168. #define PD_APDO_PPS_MAX_VOLTAGE_SET(v) (((v) << PD_APDO_PPS_MAX_VOLTAGE_SHIFT) & PD_APDO_PPS_MAX_VOLTAGE)
  169. #define PD_APDO_PPS_MIN_VOLTAGE_SET(v) (((v) << PD_APDO_PPS_MIN_VOLTAGE_SHIFT) & PD_APDO_PPS_MIN_VOLTAGE)
  170. /* PD Programmable Power Supply APDO current */
  171. #define PD_APDO_PPS_CURRENT_GET(pdo) ((uint8_t) (((pdo) & PD_APDO_PPS_CURRENT) >> PD_APDO_PPS_CURRENT_SHIFT))
  172. #define PD_APDO_PPS_CURRENT_SET(i) (((i) << PD_APDO_PPS_CURRENT_SHIFT) & PD_APDO_PPS_CURRENT)
  173. /* TODO: other types of source PDO */
  174. /* PD Sink Fixed PDO */
  175. #define PD_PDO_SNK_FIXED_DUAL_ROLE_PWR_SHIFT 29
  176. #define PD_PDO_SNK_FIXED_DUAL_ROLE_PWR (1 << PD_PDO_SNK_FIXED_DUAL_ROLE_PWR_SHIFT)
  177. #define PD_PDO_SNK_FIXED_HIGHER_CAP_SHIFT 28
  178. #define PD_PDO_SNK_FIXED_HIGHER_CAP (1 << PD_PDO_SNK_FIXED_HIGHER_CAP_SHIFT)
  179. #define PD_PDO_SNK_FIXED_UNCONSTRAINED_SHIFT 27
  180. #define PD_PDO_SNK_FIXED_UNCONSTRAINED (1 << PD_PDO_SNK_FIXED_UNCONSTRAINED_SHIFT)
  181. #define PD_PDO_SNK_FIXED_USB_COMMS_SHIFT 26
  182. #define PD_PDO_SNK_FIXED_USB_COMMS (1 << PD_PDO_SNK_FIXED_USB_COMMS_SHIFT)
  183. #define PD_PDO_SNK_FIXED_DUAL_ROLE_DATA_SHIFT 25
  184. #define PD_PDO_SNK_FIXED_DUAL_ROLE_DATA (1 << PD_PDO_SNK_FIXED_DUAL_ROLE_DATA_SHIFT)
  185. #define PD_PDO_SNK_FIXED_VOLTAGE_SHIFT 10
  186. #define PD_PDO_SNK_FIXED_VOLTAGE (0x3FF << PD_PDO_SNK_FIXED_VOLTAGE_SHIFT)
  187. #define PD_PDO_SNK_FIXED_CURRENT_SHIFT 0
  188. #define PD_PDO_SNK_FIXED_CURRENT (0x3FF << PD_PDO_SNK_FIXED_CURRENT_SHIFT)
  189. /* PD Sink Fixed PDO current */
  190. #define PD_PDO_SNK_FIXED_CURRENT_SET(i) (((i) << PD_PDO_SNK_FIXED_CURRENT_SHIFT) & PD_PDO_SNK_FIXED_CURRENT)
  191. /* PD Sink Fixed PDO voltage */
  192. #define PD_PDO_SNK_FIXED_VOLTAGE_SET(v) (((v) << PD_PDO_SNK_FIXED_VOLTAGE_SHIFT) & PD_PDO_SNK_FIXED_VOLTAGE)
  193. /* TODO: other types of sink PDO */
  194. /*
  195. * PD Request Data Object
  196. */
  197. #define PD_RDO_OBJPOS_SHIFT 28
  198. #define PD_RDO_OBJPOS (0x7 << PD_RDO_OBJPOS_SHIFT)
  199. #define PD_RDO_GIVEBACK_SHIFT 27
  200. #define PD_RDO_GIVEBACK (1 << PD_RDO_GIVEBACK_SHIFT)
  201. #define PD_RDO_CAP_MISMATCH_SHIFT 26
  202. #define PD_RDO_CAP_MISMATCH (1 << PD_RDO_CAP_MISMATCH_SHIFT)
  203. #define PD_RDO_USB_COMMS_SHIFT 25
  204. #define PD_RDO_USB_COMMS (1 << PD_RDO_USB_COMMS_SHIFT)
  205. #define PD_RDO_NO_USB_SUSPEND_SHIFT 24
  206. #define PD_RDO_NO_USB_SUSPEND (1 << PD_RDO_NO_USB_SUSPEND_SHIFT)
  207. #define PD_RDO_UNCHUNKED_EXT_MSG_SHIFT 23
  208. #define PD_RDO_UNCHUNKED_EXT_MSG (1 << PD_RDO_UNCHUNKED_EXT_MSG_SHIFT)
  209. #define PD_RDO_OBJPOS_SET(i) (((i) << PD_RDO_OBJPOS_SHIFT) & PD_RDO_OBJPOS)
  210. #define PD_RDO_OBJPOS_GET(msg) (((msg)->obj[0] & PD_RDO_OBJPOS) >> PD_RDO_OBJPOS_SHIFT)
  211. /* Fixed and Variable RDO, no GiveBack support */
  212. #define PD_RDO_FV_CURRENT_SHIFT 10
  213. #define PD_RDO_FV_CURRENT (0x3FF << PD_RDO_FV_CURRENT_SHIFT)
  214. #define PD_RDO_FV_MAX_CURRENT_SHIFT 0
  215. #define PD_RDO_FV_MAX_CURRENT (0x3FF << PD_RDO_FV_MAX_CURRENT_SHIFT)
  216. #define PD_RDO_FV_CURRENT_SET(i) (((i) << PD_RDO_FV_CURRENT_SHIFT) & PD_RDO_FV_CURRENT)
  217. #define PD_RDO_FV_MAX_CURRENT_SET(i) (((i) << PD_RDO_FV_MAX_CURRENT_SHIFT) & PD_RDO_FV_MAX_CURRENT)
  218. /* Fixed and Variable RDO with GiveBack support */
  219. #define PD_RDO_FV_MIN_CURRENT_SHIFT 0
  220. #define PD_RDO_FV_MIN_CURRENT (0x3FF << PD_RDO_FV_MIN_CURRENT_SHIFT)
  221. #define PD_RDO_FV_MIN_CURRENT_SET(i) (((i) << PD_RDO_FV_MIN_CURRENT_SHIFT) & PD_RDO_FV_MIN_CURRENT)
  222. /* TODO: Battery RDOs */
  223. /* Programmable RDO */
  224. #define PD_RDO_PROG_VOLTAGE_SHIFT 9
  225. #define PD_RDO_PROG_VOLTAGE (0x7FF << PD_RDO_PROG_VOLTAGE_SHIFT)
  226. #define PD_RDO_PROG_CURRENT_SHIFT 0
  227. #define PD_RDO_PROG_CURRENT (0x7F << PD_RDO_PROG_CURRENT_SHIFT)
  228. #define PD_RDO_PROG_VOLTAGE_SET(i) (((i) << PD_RDO_PROG_VOLTAGE_SHIFT) & PD_RDO_PROG_VOLTAGE)
  229. #define PD_RDO_PROG_CURRENT_SET(i) (((i) << PD_RDO_PROG_CURRENT_SHIFT) & PD_RDO_PROG_CURRENT)
  230. /*
  231. * Time values
  232. *
  233. * Where a range is specified, the middle of the range (rounded down to the
  234. * nearest millisecond) is used.
  235. */
  236. #define PD_T_CHUNKING_NOT_SUPPORTED TIME_MS2I(45)
  237. #define PD_T_HARD_RESET_COMPLETE TIME_MS2I(4)
  238. #define PD_T_PS_TRANSITION TIME_MS2I(500)
  239. #define PD_T_SENDER_RESPONSE TIME_MS2I(27)
  240. #define PD_T_SINK_REQUEST TIME_MS2I(100)
  241. #define PD_T_TYPEC_SINK_WAIT_CAP TIME_MS2I(465)
  242. #define PD_T_PPS_REQUEST TIME_S2I(10)
  243. /* This is actually from Type-C, not Power Delivery, but who cares? */
  244. #define PD_T_PD_DEBOUNCE TIME_MS2I(15)
  245. /*
  246. * Counter maximums
  247. */
  248. #define PD_N_HARD_RESET_COUNT 2
  249. /*
  250. * Value parameters
  251. */
  252. #define PD_MAX_EXT_MSG_LEN 260
  253. #define PD_MAX_EXT_MSG_CHUNK_LEN 26
  254. #define PD_MAX_EXT_MSG_LEGACY_LEN 26
  255. /*
  256. * Unit conversions
  257. *
  258. * V: volt
  259. * CV: centivolt
  260. * MV: millivolt
  261. * PRV: Programmable RDO voltage unit (20 mV)
  262. * PDV: Power Delivery voltage unit (50 mV)
  263. * PAV: PPS APDO voltage unit (100 mV)
  264. *
  265. * A: ampere
  266. * CA: centiampere
  267. * MA: milliampere
  268. * PDI: Power Delivery current unit (10 mA)
  269. * PAI: PPS APDO current unit (50 mA)
  270. *
  271. * W: watt
  272. * CW: centiwatt
  273. * MW: milliwatt
  274. *
  275. * O: ohm
  276. * CO: centiohm
  277. * MO: milliohm
  278. */
  279. #define PD_MV2PRV(mv) ((mv) / 20)
  280. #define PD_MV2PDV(mv) ((mv) / 50)
  281. #define PD_MV2PAV(mv) ((mv) / 100)
  282. #define PD_PRV2MV(prv) ((prv) * 20)
  283. #define PD_PDV2MV(pdv) ((pdv) * 50)
  284. #define PD_PAV2MV(pav) ((pav) * 100)
  285. #define PD_MA2CA(ma) (((ma) + 10 - 1) / 10)
  286. #define PD_MA2PDI(ma) (((ma) + 10 - 1) / 10)
  287. #define PD_MA2PAI(ma) (((ma) + 50 - 1) / 50)
  288. #define PD_CA2PAI(ca) (((ca) + 5 - 1) / 5)
  289. #define PD_PDI2MA(pdi) ((pdi) * 10)
  290. #define PD_PAI2MA(pai) ((pai) * 50)
  291. #define PD_PAI2CA(pai) ((pai) * 5)
  292. #define PD_MW2CW(mw) ((mw) / 10)
  293. #define PD_MO2CO(mo) ((mo) / 10)
  294. /* Get portions of a voltage in more normal units */
  295. #define PD_MV_V(mv) ((mv) / 1000)
  296. #define PD_MV_MV(mv) ((mv) % 1000)
  297. #define PD_PDV_V(pdv) ((pdv) / 20)
  298. #define PD_PDV_CV(pdv) (5 * ((pdv) % 20))
  299. #define PD_PAV_V(pav) ((pav) / 10)
  300. #define PD_PAV_CV(pav) (10 * ((pav) % 10))
  301. /* Get portions of a PD current in more normal units */
  302. #define PD_PDI_A(pdi) ((pdi) / 100)
  303. #define PD_PDI_CA(pdi) ((pdi) % 100)
  304. #define PD_PAI_A(pai) ((pai) / 20)
  305. #define PD_PAI_CA(pai) (5 * ((pai) % 20))
  306. /* Get portions of a power in more normal units */
  307. #define PD_CW_W(cw) ((cw) / 100)
  308. #define PD_CW_CW(cw) ((cw) % 100)
  309. /* Get portions of a resistance in more normal units */
  310. #define PD_CO_O(co) ((co) / 100)
  311. #define PD_CO_CO(co) ((co) % 100)
  312. /*
  313. * Unit constants
  314. */
  315. #define PD_MV_MIN 0
  316. #define PD_MV_MAX 21000
  317. #define PD_PDV_MIN PD_MV2PDV(PD_MV_MIN)
  318. #define PD_PDV_MAX PD_MV2PDV(PD_MV_MAX)
  319. #define PD_MA_MIN 0
  320. #define PD_MA_MAX 5000
  321. #define PD_CA_MIN PD_MA2CA(PD_MA_MIN)
  322. #define PD_CA_MAX PD_MA2CA(PD_MA_MAX)
  323. #define PD_PDI_MIN PD_MA2PDI(PD_MA_MIN)
  324. #define PD_PDI_MAX PD_MA2PDI(PD_MA_MAX)
  325. #define PD_MW_MIN 0
  326. #define PD_MW_MAX 100000
  327. #define PD_MO_MIN 500
  328. #define PD_MO_MAX 655350
  329. #endif /* PDB_PD_H */