ump_msg.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Universal MIDI Packet (UMP): Message Definitions
  4. */
  5. #ifndef __SOUND_UMP_MSG_H
  6. #define __SOUND_UMP_MSG_H
  7. /* MIDI 1.0 / 2.0 Status Code (4bit) */
  8. enum {
  9. UMP_MSG_STATUS_PER_NOTE_RCC = 0x0,
  10. UMP_MSG_STATUS_PER_NOTE_ACC = 0x1,
  11. UMP_MSG_STATUS_RPN = 0x2,
  12. UMP_MSG_STATUS_NRPN = 0x3,
  13. UMP_MSG_STATUS_RELATIVE_RPN = 0x4,
  14. UMP_MSG_STATUS_RELATIVE_NRPN = 0x5,
  15. UMP_MSG_STATUS_PER_NOTE_PITCH_BEND = 0x6,
  16. UMP_MSG_STATUS_NOTE_OFF = 0x8,
  17. UMP_MSG_STATUS_NOTE_ON = 0x9,
  18. UMP_MSG_STATUS_POLY_PRESSURE = 0xa,
  19. UMP_MSG_STATUS_CC = 0xb,
  20. UMP_MSG_STATUS_PROGRAM = 0xc,
  21. UMP_MSG_STATUS_CHANNEL_PRESSURE = 0xd,
  22. UMP_MSG_STATUS_PITCH_BEND = 0xe,
  23. UMP_MSG_STATUS_PER_NOTE_MGMT = 0xf,
  24. };
  25. /* MIDI 1.0 Channel Control (7bit) */
  26. enum {
  27. UMP_CC_BANK_SELECT = 0,
  28. UMP_CC_MODULATION = 1,
  29. UMP_CC_BREATH = 2,
  30. UMP_CC_FOOT = 4,
  31. UMP_CC_PORTAMENTO_TIME = 5,
  32. UMP_CC_DATA = 6,
  33. UMP_CC_VOLUME = 7,
  34. UMP_CC_BALANCE = 8,
  35. UMP_CC_PAN = 10,
  36. UMP_CC_EXPRESSION = 11,
  37. UMP_CC_EFFECT_CONTROL_1 = 12,
  38. UMP_CC_EFFECT_CONTROL_2 = 13,
  39. UMP_CC_GP_1 = 16,
  40. UMP_CC_GP_2 = 17,
  41. UMP_CC_GP_3 = 18,
  42. UMP_CC_GP_4 = 19,
  43. UMP_CC_BANK_SELECT_LSB = 32,
  44. UMP_CC_MODULATION_LSB = 33,
  45. UMP_CC_BREATH_LSB = 34,
  46. UMP_CC_FOOT_LSB = 36,
  47. UMP_CC_PORTAMENTO_TIME_LSB = 37,
  48. UMP_CC_DATA_LSB = 38,
  49. UMP_CC_VOLUME_LSB = 39,
  50. UMP_CC_BALANCE_LSB = 40,
  51. UMP_CC_PAN_LSB = 42,
  52. UMP_CC_EXPRESSION_LSB = 43,
  53. UMP_CC_EFFECT1_LSB = 44,
  54. UMP_CC_EFFECT2_LSB = 45,
  55. UMP_CC_GP_1_LSB = 48,
  56. UMP_CC_GP_2_LSB = 49,
  57. UMP_CC_GP_3_LSB = 50,
  58. UMP_CC_GP_4_LSB = 51,
  59. UMP_CC_SUSTAIN = 64,
  60. UMP_CC_PORTAMENTO_SWITCH = 65,
  61. UMP_CC_SOSTENUTO = 66,
  62. UMP_CC_SOFT_PEDAL = 67,
  63. UMP_CC_LEGATO = 68,
  64. UMP_CC_HOLD_2 = 69,
  65. UMP_CC_SOUND_CONTROLLER_1 = 70,
  66. UMP_CC_SOUND_CONTROLLER_2 = 71,
  67. UMP_CC_SOUND_CONTROLLER_3 = 72,
  68. UMP_CC_SOUND_CONTROLLER_4 = 73,
  69. UMP_CC_SOUND_CONTROLLER_5 = 74,
  70. UMP_CC_SOUND_CONTROLLER_6 = 75,
  71. UMP_CC_SOUND_CONTROLLER_7 = 76,
  72. UMP_CC_SOUND_CONTROLLER_8 = 77,
  73. UMP_CC_SOUND_CONTROLLER_9 = 78,
  74. UMP_CC_SOUND_CONTROLLER_10 = 79,
  75. UMP_CC_GP_5 = 80,
  76. UMP_CC_GP_6 = 81,
  77. UMP_CC_GP_7 = 82,
  78. UMP_CC_GP_8 = 83,
  79. UMP_CC_PORTAMENTO_CONTROL = 84,
  80. UMP_CC_EFFECT_1 = 91,
  81. UMP_CC_EFFECT_2 = 92,
  82. UMP_CC_EFFECT_3 = 93,
  83. UMP_CC_EFFECT_4 = 94,
  84. UMP_CC_EFFECT_5 = 95,
  85. UMP_CC_DATA_INC = 96,
  86. UMP_CC_DATA_DEC = 97,
  87. UMP_CC_NRPN_LSB = 98,
  88. UMP_CC_NRPN_MSB = 99,
  89. UMP_CC_RPN_LSB = 100,
  90. UMP_CC_RPN_MSB = 101,
  91. UMP_CC_ALL_SOUND_OFF = 120,
  92. UMP_CC_RESET_ALL = 121,
  93. UMP_CC_LOCAL_CONTROL = 122,
  94. UMP_CC_ALL_NOTES_OFF = 123,
  95. UMP_CC_OMNI_OFF = 124,
  96. UMP_CC_OMNI_ON = 125,
  97. UMP_CC_POLY_OFF = 126,
  98. UMP_CC_POLY_ON = 127,
  99. };
  100. /* MIDI 1.0 / 2.0 System Messages (0xfx) */
  101. enum {
  102. UMP_SYSTEM_STATUS_MIDI_TIME_CODE = 0xf1,
  103. UMP_SYSTEM_STATUS_SONG_POSITION = 0xf2,
  104. UMP_SYSTEM_STATUS_SONG_SELECT = 0xf3,
  105. UMP_SYSTEM_STATUS_TUNE_REQUEST = 0xf6,
  106. UMP_SYSTEM_STATUS_TIMING_CLOCK = 0xf8,
  107. UMP_SYSTEM_STATUS_START = 0xfa,
  108. UMP_SYSTEM_STATUS_CONTINUE = 0xfb,
  109. UMP_SYSTEM_STATUS_STOP = 0xfc,
  110. UMP_SYSTEM_STATUS_ACTIVE_SENSING = 0xfe,
  111. UMP_SYSTEM_STATUS_RESET = 0xff,
  112. };
  113. /* MIDI 1.0 Realtime and SysEx status messages (0xfx) */
  114. enum {
  115. UMP_MIDI1_MSG_REALTIME = 0xf0, /* mask */
  116. UMP_MIDI1_MSG_SYSEX_START = 0xf0,
  117. UMP_MIDI1_MSG_SYSEX_END = 0xf7,
  118. };
  119. /*
  120. * UMP Message Definitions
  121. */
  122. /* MIDI 1.0 Note Off / Note On (32bit) */
  123. struct snd_ump_midi1_msg_note {
  124. #ifdef __BIG_ENDIAN_BITFIELD
  125. u32 type:4;
  126. u32 group:4;
  127. u32 status:4;
  128. u32 channel:4;
  129. u32 note:8;
  130. u32 velocity:8;
  131. #else
  132. u32 velocity:8;
  133. u32 note:8;
  134. u32 channel:4;
  135. u32 status:4;
  136. u32 group:4;
  137. u32 type:4;
  138. #endif
  139. } __packed;
  140. /* MIDI 1.0 Poly Pressure (32bit) */
  141. struct snd_ump_midi1_msg_paf {
  142. #ifdef __BIG_ENDIAN_BITFIELD
  143. u32 type:4;
  144. u32 group:4;
  145. u32 status:4;
  146. u32 channel:4;
  147. u32 note:8;
  148. u32 data:8;
  149. #else
  150. u32 data:8;
  151. u32 note:8;
  152. u32 channel:4;
  153. u32 status:4;
  154. u32 group:4;
  155. u32 type:4;
  156. #endif
  157. } __packed;
  158. /* MIDI 1.0 Control Change (32bit) */
  159. struct snd_ump_midi1_msg_cc {
  160. #ifdef __BIG_ENDIAN_BITFIELD
  161. u32 type:4;
  162. u32 group:4;
  163. u32 status:4;
  164. u32 channel:4;
  165. u32 index:8;
  166. u32 data:8;
  167. #else
  168. u32 data:8;
  169. u32 index:8;
  170. u32 channel:4;
  171. u32 status:4;
  172. u32 group:4;
  173. u32 type:4;
  174. #endif
  175. } __packed;
  176. /* MIDI 1.0 Program Change (32bit) */
  177. struct snd_ump_midi1_msg_program {
  178. #ifdef __BIG_ENDIAN_BITFIELD
  179. u32 type:4;
  180. u32 group:4;
  181. u32 status:4;
  182. u32 channel:4;
  183. u32 program:8;
  184. u32 reserved:8;
  185. #else
  186. u32 reserved:8;
  187. u32 program:8;
  188. u32 channel:4;
  189. u32 status:4;
  190. u32 group:4;
  191. u32 type:4;
  192. #endif
  193. } __packed;
  194. /* MIDI 1.0 Channel Pressure (32bit) */
  195. struct snd_ump_midi1_msg_caf {
  196. #ifdef __BIG_ENDIAN_BITFIELD
  197. u32 type:4;
  198. u32 group:4;
  199. u32 status:4;
  200. u32 channel:4;
  201. u32 data:8;
  202. u32 reserved:8;
  203. #else
  204. u32 reserved:8;
  205. u32 data:8;
  206. u32 channel:4;
  207. u32 status:4;
  208. u32 group:4;
  209. u32 type:4;
  210. #endif
  211. } __packed;
  212. /* MIDI 1.0 Pitch Bend (32bit) */
  213. struct snd_ump_midi1_msg_pitchbend {
  214. #ifdef __BIG_ENDIAN_BITFIELD
  215. u32 type:4;
  216. u32 group:4;
  217. u32 status:4;
  218. u32 channel:4;
  219. u32 data_lsb:8;
  220. u32 data_msb:8;
  221. #else
  222. u32 data_msb:8;
  223. u32 data_lsb:8;
  224. u32 channel:4;
  225. u32 status:4;
  226. u32 group:4;
  227. u32 type:4;
  228. #endif
  229. } __packed;
  230. /* System Common and Real Time messages (32bit); no channel field */
  231. struct snd_ump_system_msg {
  232. #ifdef __BIG_ENDIAN_BITFIELD
  233. u32 type:4;
  234. u32 group:4;
  235. u32 status:8;
  236. u32 parm1:8;
  237. u32 parm2:8;
  238. #else
  239. u32 parm2:8;
  240. u32 parm1:8;
  241. u32 status:8;
  242. u32 group:4;
  243. u32 type:4;
  244. #endif
  245. } __packed;
  246. /* MIDI 1.0 UMP CVM (32bit) */
  247. union snd_ump_midi1_msg {
  248. struct snd_ump_midi1_msg_note note;
  249. struct snd_ump_midi1_msg_paf paf;
  250. struct snd_ump_midi1_msg_cc cc;
  251. struct snd_ump_midi1_msg_program pg;
  252. struct snd_ump_midi1_msg_caf caf;
  253. struct snd_ump_midi1_msg_pitchbend pb;
  254. struct snd_ump_system_msg system;
  255. u32 raw;
  256. };
  257. /* MIDI 2.0 Note Off / Note On (64bit) */
  258. struct snd_ump_midi2_msg_note {
  259. #ifdef __BIG_ENDIAN_BITFIELD
  260. /* 0 */
  261. u32 type:4;
  262. u32 group:4;
  263. u32 status:4;
  264. u32 channel:4;
  265. u32 note:8;
  266. u32 attribute_type:8;
  267. /* 1 */
  268. u32 velocity:16;
  269. u32 attribute_data:16;
  270. #else
  271. /* 0 */
  272. u32 attribute_type:8;
  273. u32 note:8;
  274. u32 channel:4;
  275. u32 status:4;
  276. u32 group:4;
  277. u32 type:4;
  278. /* 1 */
  279. u32 attribute_data:16;
  280. u32 velocity:16;
  281. #endif
  282. } __packed;
  283. /* MIDI 2.0 Poly Pressure (64bit) */
  284. struct snd_ump_midi2_msg_paf {
  285. #ifdef __BIG_ENDIAN_BITFIELD
  286. /* 0 */
  287. u32 type:4;
  288. u32 group:4;
  289. u32 status:4;
  290. u32 channel:4;
  291. u32 note:8;
  292. u32 reserved:8;
  293. /* 1 */
  294. u32 data;
  295. #else
  296. /* 0 */
  297. u32 reserved:8;
  298. u32 note:8;
  299. u32 channel:4;
  300. u32 status:4;
  301. u32 group:4;
  302. u32 type:4;
  303. /* 1 */
  304. u32 data;
  305. #endif
  306. } __packed;
  307. /* MIDI 2.0 Per-Note Controller (64bit) */
  308. struct snd_ump_midi2_msg_pernote_cc {
  309. #ifdef __BIG_ENDIAN_BITFIELD
  310. /* 0 */
  311. u32 type:4;
  312. u32 group:4;
  313. u32 status:4;
  314. u32 channel:4;
  315. u32 note:8;
  316. u32 index:8;
  317. /* 1 */
  318. u32 data;
  319. #else
  320. /* 0 */
  321. u32 index:8;
  322. u32 note:8;
  323. u32 channel:4;
  324. u32 status:4;
  325. u32 group:4;
  326. u32 type:4;
  327. /* 1 */
  328. u32 data;
  329. #endif
  330. } __packed;
  331. /* MIDI 2.0 Per-Note Management (64bit) */
  332. struct snd_ump_midi2_msg_pernote_mgmt {
  333. #ifdef __BIG_ENDIAN_BITFIELD
  334. /* 0 */
  335. u32 type:4;
  336. u32 group:4;
  337. u32 status:4;
  338. u32 channel:4;
  339. u32 note:8;
  340. u32 flags:8;
  341. /* 1 */
  342. u32 reserved;
  343. #else
  344. /* 0 */
  345. u32 flags:8;
  346. u32 note:8;
  347. u32 channel:4;
  348. u32 status:4;
  349. u32 group:4;
  350. u32 type:4;
  351. /* 1 */
  352. u32 reserved;
  353. #endif
  354. } __packed;
  355. /* MIDI 2.0 Control Change (64bit) */
  356. struct snd_ump_midi2_msg_cc {
  357. #ifdef __BIG_ENDIAN_BITFIELD
  358. /* 0 */
  359. u32 type:4;
  360. u32 group:4;
  361. u32 status:4;
  362. u32 channel:4;
  363. u32 index:8;
  364. u32 reserved:8;
  365. /* 1 */
  366. u32 data;
  367. #else
  368. /* 0 */
  369. u32 reserved:8;
  370. u32 index:8;
  371. u32 channel:4;
  372. u32 status:4;
  373. u32 group:4;
  374. u32 type:4;
  375. /* 1 */
  376. u32 data;
  377. #endif
  378. } __packed;
  379. /* MIDI 2.0 Registered Controller (RPN) / Assignable Controller (NRPN) (64bit) */
  380. struct snd_ump_midi2_msg_rpn {
  381. #ifdef __BIG_ENDIAN_BITFIELD
  382. /* 0 */
  383. u32 type:4;
  384. u32 group:4;
  385. u32 status:4;
  386. u32 channel:4;
  387. u32 bank:8;
  388. u32 index:8;
  389. /* 1 */
  390. u32 data;
  391. #else
  392. /* 0 */
  393. u32 index:8;
  394. u32 bank:8;
  395. u32 channel:4;
  396. u32 status:4;
  397. u32 group:4;
  398. u32 type:4;
  399. /* 1 */
  400. u32 data;
  401. #endif
  402. } __packed;
  403. /* MIDI 2.0 Program Change (64bit) */
  404. struct snd_ump_midi2_msg_program {
  405. #ifdef __BIG_ENDIAN_BITFIELD
  406. /* 0 */
  407. u32 type:4;
  408. u32 group:4;
  409. u32 status:4;
  410. u32 channel:4;
  411. u32 reserved:15;
  412. u32 bank_valid:1;
  413. /* 1 */
  414. u32 program:8;
  415. u32 reserved2:8;
  416. u32 bank_msb:8;
  417. u32 bank_lsb:8;
  418. #else
  419. /* 0 */
  420. u32 bank_valid:1;
  421. u32 reserved:15;
  422. u32 channel:4;
  423. u32 status:4;
  424. u32 group:4;
  425. u32 type:4;
  426. /* 1 */
  427. u32 bank_lsb:8;
  428. u32 bank_msb:8;
  429. u32 reserved2:8;
  430. u32 program:8;
  431. #endif
  432. } __packed;
  433. /* MIDI 2.0 Channel Pressure (64bit) */
  434. struct snd_ump_midi2_msg_caf {
  435. #ifdef __BIG_ENDIAN_BITFIELD
  436. /* 0 */
  437. u32 type:4;
  438. u32 group:4;
  439. u32 status:4;
  440. u32 channel:4;
  441. u32 reserved:16;
  442. /* 1 */
  443. u32 data;
  444. #else
  445. /* 0 */
  446. u32 reserved:16;
  447. u32 channel:4;
  448. u32 status:4;
  449. u32 group:4;
  450. u32 type:4;
  451. /* 1 */
  452. u32 data;
  453. #endif
  454. } __packed;
  455. /* MIDI 2.0 Pitch Bend (64bit) */
  456. struct snd_ump_midi2_msg_pitchbend {
  457. #ifdef __BIG_ENDIAN_BITFIELD
  458. /* 0 */
  459. u32 type:4;
  460. u32 group:4;
  461. u32 status:4;
  462. u32 channel:4;
  463. u32 reserved:16;
  464. /* 1 */
  465. u32 data;
  466. #else
  467. /* 0 */
  468. u32 reserved:16;
  469. u32 channel:4;
  470. u32 status:4;
  471. u32 group:4;
  472. u32 type:4;
  473. /* 1 */
  474. u32 data;
  475. #endif
  476. } __packed;
  477. /* MIDI 2.0 Per-Note Pitch Bend (64bit) */
  478. struct snd_ump_midi2_msg_pernote_pitchbend {
  479. #ifdef __BIG_ENDIAN_BITFIELD
  480. /* 0 */
  481. u32 type:4;
  482. u32 group:4;
  483. u32 status:4;
  484. u32 channel:4;
  485. u32 note:8;
  486. u32 reserved:8;
  487. /* 1 */
  488. u32 data;
  489. #else
  490. /* 0 */
  491. u32 reserved:8;
  492. u32 note:8;
  493. u32 channel:4;
  494. u32 status:4;
  495. u32 group:4;
  496. u32 type:4;
  497. /* 1 */
  498. u32 data;
  499. #endif
  500. } __packed;
  501. /* MIDI 2.0 UMP CVM (64bit) */
  502. union snd_ump_midi2_msg {
  503. struct snd_ump_midi2_msg_note note;
  504. struct snd_ump_midi2_msg_paf paf;
  505. struct snd_ump_midi2_msg_pernote_cc pernote_cc;
  506. struct snd_ump_midi2_msg_pernote_mgmt pernote_mgmt;
  507. struct snd_ump_midi2_msg_cc cc;
  508. struct snd_ump_midi2_msg_rpn rpn;
  509. struct snd_ump_midi2_msg_program pg;
  510. struct snd_ump_midi2_msg_caf caf;
  511. struct snd_ump_midi2_msg_pitchbend pb;
  512. struct snd_ump_midi2_msg_pernote_pitchbend pernote_pb;
  513. u32 raw[2];
  514. };
  515. /* UMP Stream Message: Endpoint Discovery (128bit) */
  516. struct snd_ump_stream_msg_ep_discovery {
  517. #ifdef __BIG_ENDIAN_BITFIELD
  518. /* 0 */
  519. u32 type:4;
  520. u32 format:2;
  521. u32 status:10;
  522. u32 ump_version_major:8;
  523. u32 ump_version_minor:8;
  524. /* 1 */
  525. u32 reserved:24;
  526. u32 filter_bitmap:8;
  527. /* 2-3 */
  528. u32 reserved2[2];
  529. #else
  530. /* 0 */
  531. u32 ump_version_minor:8;
  532. u32 ump_version_major:8;
  533. u32 status:10;
  534. u32 format:2;
  535. u32 type:4;
  536. /* 1 */
  537. u32 filter_bitmap:8;
  538. u32 reserved:24;
  539. /* 2-3 */
  540. u32 reserved2[2];
  541. #endif
  542. } __packed;
  543. /* UMP Stream Message: Endpoint Info Notification (128bit) */
  544. struct snd_ump_stream_msg_ep_info {
  545. #ifdef __BIG_ENDIAN_BITFIELD
  546. /* 0 */
  547. u32 type:4;
  548. u32 format:2;
  549. u32 status:10;
  550. u32 ump_version_major:8;
  551. u32 ump_version_minor:8;
  552. /* 1 */
  553. u32 static_function_block:1;
  554. u32 num_function_blocks:7;
  555. u32 reserved:8;
  556. u32 protocol:8;
  557. u32 reserved2:6;
  558. u32 jrts:2;
  559. /* 2-3 */
  560. u32 reserved3[2];
  561. #else
  562. /* 0 */
  563. u32 ump_version_minor:8;
  564. u32 ump_version_major:8;
  565. u32 status:10;
  566. u32 format:2;
  567. u32 type:4;
  568. /* 1 */
  569. u32 jrts:2;
  570. u32 reserved2:6;
  571. u32 protocol:8;
  572. u32 reserved:8;
  573. u32 num_function_blocks:7;
  574. u32 static_function_block:1;
  575. /* 2-3 */
  576. u32 reserved3[2];
  577. #endif
  578. } __packed;
  579. /* UMP Stream Message: Device Info Notification (128bit) */
  580. struct snd_ump_stream_msg_device_info {
  581. #ifdef __BIG_ENDIAN_BITFIELD
  582. /* 0 */
  583. u32 type:4;
  584. u32 format:2;
  585. u32 status:10;
  586. u32 reserved:16;
  587. /* 1 */
  588. u32 manufacture_id;
  589. /* 2 */
  590. u8 family_lsb;
  591. u8 family_msb;
  592. u8 model_lsb;
  593. u8 model_msb;
  594. /* 3 */
  595. u32 sw_revision;
  596. #else
  597. /* 0 */
  598. u32 reserved:16;
  599. u32 status:10;
  600. u32 format:2;
  601. u32 type:4;
  602. /* 1 */
  603. u32 manufacture_id;
  604. /* 2 */
  605. u8 model_msb;
  606. u8 model_lsb;
  607. u8 family_msb;
  608. u8 family_lsb;
  609. /* 3 */
  610. u32 sw_revision;
  611. #endif
  612. } __packed;
  613. /* UMP Stream Message: Stream Config Request / Notification (128bit) */
  614. struct snd_ump_stream_msg_stream_cfg {
  615. #ifdef __BIG_ENDIAN_BITFIELD
  616. /* 0 */
  617. u32 type:4;
  618. u32 format:2;
  619. u32 status:10;
  620. u32 protocol:8;
  621. u32 reserved:6;
  622. u32 jrts:2;
  623. /* 1-3 */
  624. u32 reserved2[3];
  625. #else
  626. /* 0 */
  627. u32 jrts:2;
  628. u32 reserved:6;
  629. u32 protocol:8;
  630. u32 status:10;
  631. u32 format:2;
  632. u32 type:4;
  633. /* 1-3 */
  634. u32 reserved2[3];
  635. #endif
  636. } __packed;
  637. /* UMP Stream Message: Function Block Discovery (128bit) */
  638. struct snd_ump_stream_msg_fb_discovery {
  639. #ifdef __BIG_ENDIAN_BITFIELD
  640. /* 0 */
  641. u32 type:4;
  642. u32 format:2;
  643. u32 status:10;
  644. u32 function_block_id:8;
  645. u32 filter:8;
  646. /* 1-3 */
  647. u32 reserved[3];
  648. #else
  649. /* 0 */
  650. u32 filter:8;
  651. u32 function_block_id:8;
  652. u32 status:10;
  653. u32 format:2;
  654. u32 type:4;
  655. /* 1-3 */
  656. u32 reserved[3];
  657. #endif
  658. } __packed;
  659. /* UMP Stream Message: Function Block Info Notification (128bit) */
  660. struct snd_ump_stream_msg_fb_info {
  661. #ifdef __BIG_ENDIAN_BITFIELD
  662. /* 0 */
  663. u32 type:4;
  664. u32 format:2;
  665. u32 status:10;
  666. u32 active:1;
  667. u32 function_block_id:7;
  668. u32 reserved:2;
  669. u32 ui_hint:2;
  670. u32 midi_10:2;
  671. u32 direction:2;
  672. /* 1 */
  673. u32 first_group:8;
  674. u32 num_groups:8;
  675. u32 midi_ci_version:8;
  676. u32 sysex8_streams:8;
  677. /* 2-3 */
  678. u32 reserved2[2];
  679. #else
  680. /* 0 */
  681. u32 direction:2;
  682. u32 midi_10:2;
  683. u32 ui_hint:2;
  684. u32 reserved:2;
  685. u32 function_block_id:7;
  686. u32 active:1;
  687. u32 status:10;
  688. u32 format:2;
  689. u32 type:4;
  690. /* 1 */
  691. u32 sysex8_streams:8;
  692. u32 midi_ci_version:8;
  693. u32 num_groups:8;
  694. u32 first_group:8;
  695. /* 2-3 */
  696. u32 reserved2[2];
  697. #endif
  698. } __packed;
  699. /* UMP Stream Message: Function Block Name Notification (128bit) */
  700. struct snd_ump_stream_msg_fb_name {
  701. #ifdef __BIG_ENDIAN_BITFIELD
  702. /* 0 */
  703. u16 type:4;
  704. u16 format:2;
  705. u16 status:10;
  706. u8 function_block_id;
  707. u8 name0;
  708. /* 1-3 */
  709. u8 name[12];
  710. #else
  711. /* 0 */
  712. u8 name0;
  713. u8 function_block_id;
  714. u16 status:10;
  715. u16 format:2;
  716. u16 type:4;
  717. /* 1-3 */
  718. u8 name[12]; // FIXME: byte order
  719. #endif
  720. } __packed;
  721. /* MIDI 2.0 Stream Messages (128bit) */
  722. union snd_ump_stream_msg {
  723. struct snd_ump_stream_msg_ep_discovery ep_discovery;
  724. struct snd_ump_stream_msg_ep_info ep_info;
  725. struct snd_ump_stream_msg_device_info device_info;
  726. struct snd_ump_stream_msg_stream_cfg stream_cfg;
  727. struct snd_ump_stream_msg_fb_discovery fb_discovery;
  728. struct snd_ump_stream_msg_fb_info fb_info;
  729. struct snd_ump_stream_msg_fb_name fb_name;
  730. u32 raw[4];
  731. };
  732. #endif /* __SOUND_UMP_MSG_H */