Skip to content

Commit 89b8eeb

Browse files
author
Jarkko Paso
authored
Merge pull request ARMmbed#1810 from ARMmbed/IOTTHD-2734
Iotthd 2734
2 parents a40e012 + b68f394 commit 89b8eeb

File tree

15 files changed

+199
-71
lines changed

15 files changed

+199
-71
lines changed

nanostack/fhss_config.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,12 @@ typedef struct fhss_ws_configuration
116116
/** Broadcast dwell interval. Range: 15-250 milliseconds. */
117117
uint8_t fhss_bc_dwell_interval;
118118

119+
/** Unicast fixed channel */
120+
uint8_t unicast_fixed_channel;
121+
122+
/** Broadcast fixed channel */
123+
uint8_t broadcast_fixed_channel;
124+
119125
/** Channel mask. */
120126
uint32_t channel_mask[8];
121127

nanostack/fhss_ws_extension.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ typedef struct unicast_timing_info {
3737
unsigned unicast_channel_function:3; /**< Unicast schedule channel function */
3838
uint8_t unicast_dwell_interval; /**< Unicast dwell interval */
3939
uint16_t unicast_number_of_channels; /**< Unicast number of channels */
40-
uint16_t fixed_channel; /**< fixed channel*/
40+
uint16_t fixed_channel; /**< Unicast fixed channel*/
4141
uint_fast24_t ufsi; /**< Unicast fractional sequence interval */
4242
uint32_t utt_rx_timestamp; /**< UTT-IE reception timestamp */
4343
} unicast_timing_info_t;
@@ -48,6 +48,7 @@ typedef struct unicast_timing_info {
4848
typedef struct broadcast_timing_info {
4949
unsigned broadcast_channel_function:3; /**< Broadcast schedule channel function */
5050
uint8_t broadcast_dwell_interval; /**< Broadcast dwell interval */
51+
uint16_t fixed_channel; /**< Broadcast fixed channel*/
5152
uint16_t broadcast_slot; /**< Broadcast slot number */
5253
uint16_t broadcast_schedule_id; /**< Broadcast schedule identifier */
5354
uint_fast24_t broadcast_interval_offset; /**< Broadcast interval offset */

nanostack/ws_management_api.h

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@
3131
#include "ns_types.h"
3232
#include "net_interface.h" /* Declaration for channel_list_s. */
3333

34+
// TODO: Remove when application updated
35+
#define DEFAULT_FIXED_CHANNEL 11
36+
#define DEFAULT_DWELL_TIME 250
37+
#define ws_management_fhss_channel_function_configure(x,y) ws_management_fhss_unicast_channel_function_configure(x,y,DEFAULT_FIXED_CHANNEL,DEFAULT_DWELL_TIME)
38+
3439
#ifdef __cplusplus
3540
extern "C" {
3641
#endif
@@ -140,7 +145,8 @@ int ws_management_channel_mask_set(
140145
*
141146
* \param interface_id Network interface ID.
142147
* \param channel_plan Channel plan must be 1 application defined if deviating from regulatory domain (0).
143-
* \param channel_function 0: Fixed channel, 1:TR51CF, 2: Direct Hash, 3: Vendor defined.
148+
* \param uc_channel_function 0: Fixed channel, 1:TR51CF, 2: Direct Hash, 3: Vendor defined.
149+
* \param bc_channel_function 0: Fixed channel, 1:TR51CF, 2: Direct Hash, 3: Vendor defined.
144150
* \param ch0_freq ch0 center frequency.
145151
* \param channel_spacing Channel spacing value 0:200k, 1:400k, 2:600k, 3:100k.
146152
* \param number_of_channels FHSS phy operating mode default to "1b".
@@ -151,7 +157,8 @@ int ws_management_channel_mask_set(
151157
int ws_management_channel_plan_set(
152158
int8_t interface_id,
153159
uint8_t channel_plan,
154-
uint8_t channel_function,
160+
uint8_t uc_channel_function,
161+
uint8_t bc_channel_function,
155162
uint32_t ch0_freq, // Stack can not modify this
156163
uint8_t channel_spacing,// Stack can not modify this
157164
uint8_t number_of_channels);// Stack can not modify this
@@ -176,20 +183,47 @@ int ws_management_fhss_timing_configure(
176183
uint8_t fhss_bc_dwell_interval);
177184

178185
/**
179-
* Configure channel function.
186+
* Configure unicast channel function.
180187
*
181188
* Change the default configuration for Wi-SUN FHSS operation.
182189
* This will use randomized value for fixed channel if used.
183190
* if application defined is used the behaviour is undefined
184191
*
185192
* \param interface_id Network interface ID.
186-
* \param channel_function channel
193+
* \param channel_function Unicast channel function.
194+
* \param fixed_channel Used channel when channel function is fixed channel.
195+
* \param dwell_interval Used dwell interval when channel function is TR51 or DH1.
187196
*
188197
* \return 0, Init OK.
189198
* \return <0 Init fail.
190199
*/
191-
int ws_management_fhss_channel_function_configure(
200+
int ws_management_fhss_unicast_channel_function_configure(
192201
int8_t interface_id,
193-
uint8_t channel_function);
202+
uint8_t channel_function,
203+
uint8_t fixed_channel,
204+
uint8_t dwell_interval);
205+
206+
/**
207+
* Configure broadcast channel function.
208+
*
209+
* Change the default configuration for Wi-SUN FHSS operation.
210+
* This will use randomized value for fixed channel if used.
211+
* if application defined is used the behaviour is undefined
212+
*
213+
* \param interface_id Network interface ID.
214+
* \param channel_function Broadcast channel function.
215+
* \param fixed_channel Used channel when channel function is fixed channel.
216+
* \param dwell_interval Broadcast channel dwell interval.
217+
* \param broadcast_interval Broadcast interval.
218+
*
219+
* \return 0, Init OK.
220+
* \return <0 Init fail.
221+
*/
222+
int ws_management_fhss_broadcast_channel_function_configure(
223+
int8_t interface_id,
224+
uint8_t channel_function,
225+
uint8_t fixed_channel,
226+
uint8_t dwell_interval,
227+
uint32_t broadcast_interval);
194228

195229
#endif /* WS_MANAGEMENT_API_H_ */

source/6LoWPAN/ws/ws_bootstrap.c

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,10 @@ static fhss_ws_neighbor_timing_info_t *ws_get_neighbor_info(const fhss_api_t *ap
182182
static void ws_bootstrap_llc_hopping_update(struct protocol_interface_info_entry *cur, const fhss_ws_configuration_t *fhss_configuration)
183183
{
184184
memcpy(cur->ws_info->hopping_schdule.channel_mask, fhss_configuration->channel_mask, sizeof(uint32_t) * 8);
185-
cur->ws_info->hopping_schdule.channel_function = fhss_configuration->ws_uc_channel_function;
185+
cur->ws_info->hopping_schdule.uc_fixed_channel = fhss_configuration->unicast_fixed_channel;
186+
cur->ws_info->hopping_schdule.bc_fixed_channel = fhss_configuration->broadcast_fixed_channel;
187+
cur->ws_info->hopping_schdule.uc_channel_function = fhss_configuration->ws_uc_channel_function;
188+
cur->ws_info->hopping_schdule.bc_channel_function = fhss_configuration->ws_bc_channel_function;
186189
cur->ws_info->hopping_schdule.fhss_bc_dwell_interval = fhss_configuration->fhss_bc_dwell_interval;
187190
cur->ws_info->hopping_schdule.fhss_broadcast_interval = fhss_configuration->fhss_broadcast_interval;
188191
cur->ws_info->hopping_schdule.fhss_uc_dwell_interval = fhss_configuration->fhss_uc_dwell_interval;
@@ -205,7 +208,8 @@ static int8_t ws_fhss_initialize(protocol_interface_info_entry_t *cur)
205208
}
206209

207210
fhss_configuration.fhss_uc_dwell_interval = cur->ws_info->fhss_uc_dwell_interval;
208-
fhss_configuration.ws_uc_channel_function = cur->ws_info->fhss_channel_function;
211+
fhss_configuration.ws_uc_channel_function = cur->ws_info->fhss_uc_channel_function;
212+
fhss_configuration.ws_bc_channel_function = cur->ws_info->fhss_bc_channel_function;
209213
fhss_configuration.fhss_bc_dwell_interval = cur->ws_info->fhss_bc_dwell_interval;
210214
fhss_configuration.fhss_broadcast_interval = cur->ws_info->fhss_bc_interval;
211215

@@ -223,7 +227,8 @@ static int8_t ws_fhss_initialize(protocol_interface_info_entry_t *cur)
223227
return 0;
224228
}
225229
memcpy(cur->ws_info->fhss_channel_mask, fhss_configuration->channel_mask, sizeof(uint32_t) * 8);
226-
cur->ws_info->fhss_channel_function = fhss_configuration->ws_uc_channel_function;
230+
cur->ws_info->fhss_uc_channel_function = fhss_configuration->ws_uc_channel_function;
231+
cur->ws_info->fhss_bc_channel_function = fhss_configuration->ws_bc_channel_function;
227232
cur->ws_info->fhss_bc_dwell_interval = fhss_configuration->fhss_bc_dwell_interval;
228233
cur->ws_info->fhss_bc_interval = fhss_configuration->fhss_broadcast_interval;
229234
cur->ws_info->fhss_uc_dwell_interval = fhss_configuration->fhss_uc_dwell_interval;
@@ -233,11 +238,12 @@ static int8_t ws_fhss_initialize(protocol_interface_info_entry_t *cur)
233238
static int8_t ws_fhss_set_defaults(protocol_interface_info_entry_t *cur, fhss_ws_configuration_t *fhss_configuration)
234239
{
235240
fhss_configuration->fhss_uc_dwell_interval = cur->ws_info->fhss_uc_dwell_interval;
236-
fhss_configuration->ws_uc_channel_function = cur->ws_info->fhss_channel_function;
237-
// TODO: Just temporarily using hard coded broadcast channel function
238-
fhss_configuration->ws_bc_channel_function = WS_DH1CF;
241+
fhss_configuration->ws_uc_channel_function = cur->ws_info->fhss_uc_channel_function;
242+
fhss_configuration->ws_bc_channel_function = cur->ws_info->fhss_bc_channel_function;
239243
fhss_configuration->fhss_bc_dwell_interval = cur->ws_info->fhss_bc_dwell_interval;
240244
fhss_configuration->fhss_broadcast_interval = cur->ws_info->fhss_bc_interval;
245+
fhss_configuration->unicast_fixed_channel = cur->ws_info->fhss_uc_fixed_channel;
246+
fhss_configuration->broadcast_fixed_channel = cur->ws_info->fhss_bc_fixed_channel;
241247
ws_generate_channel_list(fhss_configuration->channel_mask, cur->ws_info->hopping_schdule.number_of_channels, cur->ws_info->hopping_schdule.regulatory_domain);
242248

243249
// using bitwise AND operation for user set channel mask to remove channels not allowed in this device
@@ -270,12 +276,15 @@ static int8_t ws_fhss_discovery_configure(protocol_interface_info_entry_t *cur)
270276

271277
fhss_configuration.fhss_uc_dwell_interval = 0;
272278
fhss_configuration.ws_uc_channel_function = WS_FIXED_CHANNEL;
279+
fhss_configuration.ws_bc_channel_function = WS_FIXED_CHANNEL;
273280
fhss_configuration.fhss_bc_dwell_interval = 0;
274281
fhss_configuration.fhss_broadcast_interval = 0;
275-
cur->ws_info->hopping_schdule.fixed_channel = randLIB_get_random_in_range(0,cur->ws_info->hopping_schdule.number_of_channels - 1);
282+
cur->ws_info->fhss_uc_fixed_channel = randLIB_get_random_in_range(0,cur->ws_info->hopping_schdule.number_of_channels - 1);
283+
cur->ws_info->fhss_bc_fixed_channel = randLIB_get_random_in_range(0,cur->ws_info->hopping_schdule.number_of_channels - 1);
276284
memset(fhss_configuration.channel_mask, 0, sizeof(uint32_t) * 8);
277-
channel_list_set_channel(fhss_configuration.channel_mask, cur->ws_info->hopping_schdule.fixed_channel, true);
278-
285+
channel_list_set_channel(fhss_configuration.channel_mask, cur->ws_info->fhss_uc_fixed_channel, true);
286+
fhss_configuration.unicast_fixed_channel = cur->ws_info->fhss_uc_fixed_channel;
287+
fhss_configuration.broadcast_fixed_channel = cur->ws_info->fhss_bc_fixed_channel;
279288
ns_fhss_ws_configuration_set(cur->ws_info->fhss_api,&fhss_configuration);
280289
ws_bootstrap_llc_hopping_update(cur,&fhss_configuration);
281290

@@ -313,17 +322,16 @@ static void ws_bootstrap_primary_parent_set(struct protocol_interface_info_entry
313322

314323
ws_fhss_set_defaults(cur, &fhss_configuration);
315324

316-
// Learning unicast network configuration
317-
fhss_configuration.ws_uc_channel_function = neighbor_info->ws_neighbor->fhss_data.uc_timing_info.unicast_channel_function;
318-
if (fhss_configuration.ws_uc_channel_function == WS_FIXED_CHANNEL) {
319-
cur->ws_info->hopping_schdule.fixed_channel = neighbor_info->ws_neighbor->fhss_data.uc_timing_info.fixed_channel;
325+
// Learning broadcast network configuration
326+
fhss_configuration.ws_bc_channel_function = neighbor_info->ws_neighbor->fhss_data.bc_timing_info.broadcast_channel_function;
327+
if (fhss_configuration.ws_bc_channel_function == WS_FIXED_CHANNEL) {
328+
cur->ws_info->hopping_schdule.bc_fixed_channel = neighbor_info->ws_neighbor->fhss_data.bc_timing_info.fixed_channel;
320329
}
321-
/* Learning different unicast is not working currently at fhss network follows border router
322-
*/
323-
// Learn broadcast information from selected parent
324330
fhss_configuration.bsi = neighbor_info->ws_neighbor->fhss_data.bc_timing_info.broadcast_schedule_id;
325331
fhss_configuration.fhss_bc_dwell_interval = neighbor_info->ws_neighbor->fhss_data.bc_timing_info.broadcast_dwell_interval;
326332
fhss_configuration.fhss_broadcast_interval = neighbor_info->ws_neighbor->fhss_data.bc_timing_info.broadcast_interval;
333+
fhss_configuration.unicast_fixed_channel = cur->ws_info->fhss_uc_fixed_channel;
334+
fhss_configuration.broadcast_fixed_channel = cur->ws_info->fhss_bc_fixed_channel;
327335
ns_fhss_ws_configuration_set(cur->ws_info->fhss_api, &fhss_configuration);
328336

329337
if (fhss_configuration.fhss_bc_dwell_interval && fhss_configuration.fhss_broadcast_interval) {
@@ -1152,7 +1160,7 @@ static void ws_bootstrap_fhss_activate(protocol_interface_info_entry_t *cur)
11521160
tr_debug("MAC init");
11531161
mac_helper_pib_boolean_set(cur, macRxOnWhenIdle, true);
11541162
cur->lowpan_info &= ~INTERFACE_NWK_CONF_MAC_RX_OFF_IDLE;
1155-
ws_bootstrap_mac_activate(cur, cur->ws_info->hopping_schdule.fixed_channel, cur->ws_info->network_pan_id, true);
1163+
ws_bootstrap_mac_activate(cur, cur->ws_info->fhss_uc_fixed_channel, cur->ws_info->network_pan_id, true);
11561164
return;
11571165
}
11581166

@@ -1555,7 +1563,8 @@ static void ws_bootstrap_event_handler(arm_event_s *event)
15551563
if (cur->bootsrap_mode == ARM_NWK_BOOTSRAP_MODE_6LoWPAN_BORDER_ROUTER) {
15561564
tr_debug("Border router start network");
15571565
// Randomize fixed channel. Only used if channel plan is fixed
1558-
cur->ws_info->hopping_schdule.fixed_channel = randLIB_get_random_in_range(0,cur->ws_info->hopping_schdule.number_of_channels - 1);
1566+
cur->ws_info->fhss_uc_fixed_channel = randLIB_get_random_in_range(0,cur->ws_info->hopping_schdule.number_of_channels - 1);
1567+
cur->ws_info->fhss_bc_fixed_channel = randLIB_get_random_in_range(0,cur->ws_info->hopping_schdule.number_of_channels - 1);
15591568
cur->ws_info->network_pan_id = randLIB_get_random_in_range(0,0xfffd);
15601569
cur->ws_info->pan_information.pan_size = 0;
15611570
cur->ws_info->pan_information.pan_version = randLIB_get_random_in_range(0,0xffff);

source/6LoWPAN/ws/ws_common.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,8 @@ int8_t ws_common_allocate_and_init(protocol_interface_info_entry_t *cur)
154154
cur->ws_info->fhss_uc_dwell_interval = WS_FHSS_UC_DWELL_INTERVAL;
155155
cur->ws_info->fhss_bc_interval = WS_FHSS_BC_INTERVAL;
156156
cur->ws_info->fhss_bc_dwell_interval = WS_FHSS_BC_DWELL_INTERVAL;
157-
cur->ws_info->fhss_channel_function = WS_FIXED_CHANNEL;
157+
cur->ws_info->fhss_uc_channel_function = WS_FIXED_CHANNEL;
158+
cur->ws_info->fhss_bc_channel_function = WS_DH1CF;
158159
for (uint8_t n = 0;n < 8;n++) {
159160
cur->ws_info->fhss_channel_mask[n] = 0xffffffff;
160161
}

source/6LoWPAN/ws/ws_common.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,10 @@ typedef struct ws_info_s {
5959
uint8_t fhss_uc_dwell_interval;
6060
uint8_t fhss_bc_dwell_interval;
6161
uint32_t fhss_bc_interval;
62-
uint8_t fhss_channel_function;
62+
uint8_t fhss_uc_channel_function;
63+
uint8_t fhss_bc_channel_function;
64+
uint8_t fhss_uc_fixed_channel;
65+
uint8_t fhss_bc_fixed_channel;
6366
uint32_t fhss_channel_mask[8];
6467

6568
struct ws_pan_information_s pan_information;

source/6LoWPAN/ws/ws_common_defines.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,14 @@ typedef struct ws_hopping_schedule_s {
7373
uint8_t operating_class; /**< PHY operating class default to 1 */
7474
uint8_t operating_mode; /**< PHY operating mode default to "1b" symbol rate 50, modulation index 1 */
7575
uint8_t channel_plan; /**< 0: use regulatory domain values 1: application defined plan */
76-
uint8_t channel_function; /**< 0: Fixed channel, 1:TR51CF, 2: Direct Hash, 3: Vendor defined */
76+
uint8_t uc_channel_function; /**< 0: Fixed channel, 1:TR51CF, 2: Direct Hash, 3: Vendor defined */
77+
uint8_t bc_channel_function; /**< 0: Fixed channel, 1:TR51CF, 2: Direct Hash, 3: Vendor defined */
7778
uint8_t channel_spacing; /**< derived from regulatory domain. 0:200k, 1:400k, 2:600k, 3:100k */
7879
uint8_t number_of_channels; /**< derived from regulatory domain */
7980
uint8_t clock_drift;
8081
uint8_t timing_accurancy;
81-
uint16_t fixed_channel;
82+
uint16_t uc_fixed_channel;
83+
uint16_t bc_fixed_channel;
8284
uint16_t fhss_bsi;
8385
uint32_t fhss_broadcast_interval;
8486
uint32_t channel_mask[8];

source/6LoWPAN/ws/ws_empty_functions.c

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,16 @@ int ws_management_channel_mask_set(
6363
int ws_management_channel_plan_set(
6464
int8_t interface_id,
6565
uint8_t channel_plan,
66-
uint8_t channel_function,
66+
uint8_t uc_channel_function,
67+
uint8_t bc_channel_function,
6768
uint32_t ch0_freq, // Stack can not modify this
6869
uint8_t channel_spacing,// Stack can not modify this
6970
uint8_t number_of_channels)
7071
{
7172
(void)interface_id;
7273
(void)channel_plan;
73-
(void)channel_function;
74+
(void)uc_channel_function;
75+
(void)bc_channel_function;
7476
(void)ch0_freq;
7577
(void)channel_spacing;
7678
(void)number_of_channels;
@@ -90,14 +92,34 @@ int ws_management_fhss_timing_configure(
9092
return -1;
9193
}
9294

93-
int ws_management_fhss_channel_function_configure(
95+
int ws_management_fhss_unicast_channel_function_configure(
96+
int8_t interface_id,
97+
uint8_t channel_function,
98+
uint8_t fixed_channel,
99+
uint8_t dwell_interval)
100+
{
101+
(void)interface_id;
102+
(void)channel_function;
103+
(void)fixed_channel;
104+
(void)dwell_interval;
105+
return -1;
106+
}
107+
108+
int ws_management_fhss_broadcast_channel_function_configure(
94109
int8_t interface_id,
95-
uint8_t channel_function)
110+
uint8_t channel_function,
111+
uint8_t fixed_channel,
112+
uint8_t dwell_interval,
113+
uint32_t broadcast_interval)
96114
{
97115
(void)interface_id;
98116
(void)channel_function;
117+
(void)fixed_channel;
118+
(void)dwell_interval;
119+
(void)broadcast_interval;
99120
return -1;
100121
}
122+
101123
/* ### test api ### */
102124
int ws_test_pan_size_set(int8_t interface_id, uint16_t pan_size)
103125
{

source/6LoWPAN/ws/ws_ie_lib.c

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,18 @@ static uint16_t ws_channel_function_length(uint8_t channel_function, uint16_t ho
6969
uint16_t ws_wp_nested_hopping_schedule_length(struct ws_hopping_schedule_s *hopping_schedule, bool unicast_schedule)
7070
{
7171
uint16_t length;
72+
uint8_t channel_function;
7273
if (unicast_schedule) {
7374
length = 4;
75+
channel_function = hopping_schedule->uc_channel_function;
7476
} else {
7577
length = 10;
78+
channel_function = hopping_schedule->bc_channel_function;
7679
}
7780

7881
length += ws_channel_plan_length(hopping_schedule->channel_plan);
79-
length += ws_channel_function_length(hopping_schedule->channel_function, 1);
82+
83+
length += ws_channel_function_length(channel_function, 1);
8084

8185
//Todo Derive some how exluded channel control
8286
return length;
@@ -147,7 +151,11 @@ uint8_t *ws_wp_nested_hopping_schedule_write(uint8_t *ptr,struct ws_hopping_sche
147151
*ptr++ = hopping_schedule->timing_accurancy;
148152
uint8_t channel_info_base = 0;
149153
channel_info_base = (hopping_schedule->channel_plan);
150-
channel_info_base |= (hopping_schedule->channel_function << 3);
154+
if (unicast_schedule) {
155+
channel_info_base |= (hopping_schedule->uc_channel_function << 3);
156+
} else {
157+
channel_info_base |= (hopping_schedule->bc_channel_function << 3);
158+
}
151159
//Todo define excluded channel ctrl
152160

153161
*ptr++ = channel_info_base;
@@ -167,11 +175,18 @@ uint8_t *ws_wp_nested_hopping_schedule_write(uint8_t *ptr,struct ws_hopping_sche
167175
default:
168176
break;
169177
}
170-
171-
switch (hopping_schedule->channel_function) {
178+
uint8_t cf = hopping_schedule->uc_channel_function;
179+
uint16_t fixed_channel = hopping_schedule->uc_fixed_channel;
180+
if (!unicast_schedule) {
181+
cf = hopping_schedule->bc_channel_function;
182+
}
183+
switch (cf) {
172184
case 0:
173185
//Fixed channel inline
174-
ptr = common_write_16_bit_inverse(hopping_schedule->fixed_channel, ptr);
186+
if (!unicast_schedule) {
187+
fixed_channel = hopping_schedule->bc_fixed_channel;
188+
}
189+
ptr = common_write_16_bit_inverse(fixed_channel, ptr);
175190
break;
176191
case 1:
177192
case 2:

0 commit comments

Comments
 (0)