Skip to content

Commit 390853e

Browse files
committed
Changed setDMPODRrate so it takes the ODR register as a parameter - instead of the sensor configuration
1 parent 9fa08ae commit 390853e

File tree

6 files changed

+144
-119
lines changed

6 files changed

+144
-119
lines changed

examples/Arduino/Example5_DMP_Quat9_Orientation/Example5_DMP_Quat9_Orientation.ino

Lines changed: 26 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* Example5_DMP_Quat9_Orientation.ino
33
* ICM 20948 Arduino Library Demo
44
* Initialize the DMP based on the TDK InvenSense ICM20948_eMD_nucleo_1.0 example-icm20948
5-
* Paul Clark, February 9th 2021
5+
* Paul Clark, February 15th 2021
66
* Based on original code by:
77
* Owen Lyke @ SparkFun Electronics
88
* Original Creation Date: April 17 2019
@@ -23,9 +23,10 @@
2323
*
2424
* Distributed as-is; no warranty is given.
2525
***************************************************************/
26+
2627
#include "ICM_20948.h" // Click here to get the library: http://librarymanager/All#SparkFun_ICM_20948_IMU
2728

28-
#define USE_SPI // Uncomment this to use SPI
29+
//#define USE_SPI // Uncomment this to use SPI
2930

3031
#define SERIAL_PORT Serial
3132

@@ -66,7 +67,7 @@ void setup() {
6667
WIRE_PORT.setClock(400000);
6768
#endif
6869

69-
myICM.enableDebugging(); // Uncomment this line to enable helpful debug messages on Serial
70+
//myICM.enableDebugging(); // Uncomment this line to enable helpful debug messages on Serial
7071

7172
bool initialized = false;
7273
while( !initialized ){
@@ -144,7 +145,7 @@ void setup() {
144145
ICM_20948_smplrt_t mySmplrt;
145146
mySmplrt.g = 43; // ODR is computed as follows: 1.1 kHz/(1+GYRO_SMPLRT_DIV[7:0]). 43 = 25Hz
146147
mySmplrt.a = 44; // ODR is computed as follows: 1.125 kHz/(1+ACCEL_SMPLRT_DIV[11:0]). 44 = 25Hz
147-
myICM.setSampleRate( (ICM_20948_Internal_Acc | ICM_20948_Internal_Gyr), mySmplrt );
148+
//myICM.setSampleRate( (ICM_20948_Internal_Acc | ICM_20948_Internal_Gyr), mySmplrt ); // ** Note: comment this line to leave the sample rates at the maximum **
148149

149150
// Setup DMP start address through PRGM_STRT_ADDRH/PRGM_STRT_ADDRL
150151
success &= (myICM.setDMPstartAddress() == ICM_20948_Stat_Ok); // Defaults to DMP_START_ADDRESS
@@ -214,8 +215,10 @@ void setup() {
214215
// Enable the DMP orientation sensor
215216
success &= (myICM.enableDMPSensor(INV_ICM20948_SENSOR_ORIENTATION) == ICM_20948_Stat_Ok);
216217

217-
// Set the DMP orientation sensor rate to 25Hz
218-
success &= (myICM.setDMPODRrate(INV_ICM20948_SENSOR_ORIENTATION, 25) == ICM_20948_Stat_Ok);
218+
// Configuring DMP to output data at multiple ODRs:
219+
// DMP is capable of outputting multiple sensor data at different rates to FIFO.
220+
// Set the DMP Output Data Rate for Quat9 to 12Hz.
221+
success &= (myICM.setDMPODRrate(DMP_ODR_Reg_Quat9, 12) == ICM_20948_Stat_Ok);
219222

220223
// Enable the FIFO
221224
success &= (myICM.enableFIFO() == ICM_20948_Stat_Ok);
@@ -234,15 +237,14 @@ void setup() {
234237
SERIAL_PORT.println("DMP enabled!");
235238
else
236239
{
237-
SERIAL_PORT.print("Enable DMP failed! Status is: ");
238-
SERIAL_PORT.println( myICM.statusString() );
240+
SERIAL_PORT.println("Enable DMP failed!");
239241
}
240242

241243
}
242244

243245
void loop()
244246
{
245-
// Read any data waiting in the FIFO
247+
// Read any DMP data waiting in the FIFO
246248
// Note:
247249
// readDMPdataFromFIFO will return ICM_20948_Stat_FIFONoDataAvail if no data or incomplete data is available.
248250
// If data is available, readDMPdataFromFIFO will attempt to read _one_ frame of DMP data.
@@ -253,40 +255,26 @@ void loop()
253255

254256
if(( myICM.status == ICM_20948_Stat_Ok ) || ( myICM.status == ICM_20948_Stat_FIFOMoreDataAvail )) // Was valid data available?
255257
{
256-
SERIAL_PORT.print(F("Received data! Header: 0x")); // Print the header in HEX
257-
if ( data.header < 0x1000) SERIAL_PORT.print( "0" ); // Pad the zeros
258-
if ( data.header < 0x100) SERIAL_PORT.print( "0" );
259-
if ( data.header < 0x10) SERIAL_PORT.print( "0" );
260-
SERIAL_PORT.println( data.header, HEX );
258+
//SERIAL_PORT.print(F("Received data! Header: 0x")); // Print the header in HEX so we can see what data is arriving in the FIFO
259+
//if ( data.header < 0x1000) SERIAL_PORT.print( "0" ); // Pad the zeros
260+
//if ( data.header < 0x100) SERIAL_PORT.print( "0" );
261+
//if ( data.header < 0x10) SERIAL_PORT.print( "0" );
262+
//SERIAL_PORT.println( data.header, HEX );
261263

262264
if ( (data.header & DMP_header_bitmap_Quat9) > 0 ) // We have asked for orientation data so we should receive Quat9
263265
{
264-
// Q0 value is computed from this equation: Q20 + Q21 + Q22 + Q23 = 1.
266+
// Q0 value is computed from this equation: Q0^2 + Q1^2 + Q2^2 + Q3^2 = 1.
265267
// In case of drift, the sum will not add to 1, therefore, quaternion data need to be corrected with right bias values.
266268
// The quaternion data is scaled by 2^30.
267-
SERIAL_PORT.printf("Quat9 data is: Q1:%ld Q2:%ld Q3:%ld Accuracy:%d\r\n", data.Quat9.Data.Q1, data.Quat9.Data.Q2, data.Quat9.Data.Q3, data.Quat9.Data.Accuracy);
268-
}
269-
}
270-
else if ( myICM.status != ICM_20948_Stat_FIFONoDataAvail ) // Check for an error - but ignore "no data available"
271-
{
272-
SERIAL_PORT.print(F("readDMPdataFromFIFO failed! Status is: ")); // We got an error - so print it
273-
SERIAL_PORT.print( myICM.status );
274-
SERIAL_PORT.print(" : ");
275-
SERIAL_PORT.println( myICM.statusString() );
276-
277-
SERIAL_PORT.print(F("Header is: 0x")); // Print the header so we can check it manually
278-
if ( data.header < 0x1000) SERIAL_PORT.print( "0" ); // Pad the zeros
279-
if ( data.header < 0x100) SERIAL_PORT.print( "0" );
280-
if ( data.header < 0x10) SERIAL_PORT.print( "0" );
281-
SERIAL_PORT.println( data.header, HEX );
282-
283-
if ( data.header2 > 0 )
284-
{
285-
SERIAL_PORT.print(F("Header2 is: 0x")); // Print header2 so we can check it manually
286-
if ( data.header2 < 0x1000) SERIAL_PORT.print( "0" ); // Pad the zeros
287-
if ( data.header2 < 0x100) SERIAL_PORT.print( "0" );
288-
if ( data.header2 < 0x10) SERIAL_PORT.print( "0" );
289-
SERIAL_PORT.println( data.header2, HEX );
269+
270+
//SERIAL_PORT.printf("Quat9 data is: Q1:%ld Q2:%ld Q3:%ld Accuracy:%d\r\n", data.Quat9.Data.Q1, data.Quat9.Data.Q2, data.Quat9.Data.Q3, data.Quat9.Data.Accuracy);
271+
272+
// Scale to +/- 1
273+
float q1 = ((float)data.Quat9.Data.Q1) / 1073741824.0; // Convert to float. Divide by 2^30
274+
float q2 = ((float)data.Quat9.Data.Q2) / 1073741824.0; // Convert to float. Divide by 2^30
275+
float q3 = ((float)data.Quat9.Data.Q3) / 1073741824.0; // Convert to float. Divide by 2^30
276+
277+
SERIAL_PORT.printf("Q1:%.3f Q2:%.3f Q3:%.3f\r\n", q1, q2, q3);
290278
}
291279
}
292280

src/ICM_20948.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,9 @@ void ICM_20948::debugPrintStatus(ICM_20948_Status_e stat)
125125
case ICM_20948_Stat_UnrecognisedDMPHeader2:
126126
debugPrint(F("Unrecognised DMP Header2"));
127127
break;
128+
case ICM_20948_Stat_InvalDMPRegister:
129+
debugPrint(F("Invalid DMP Register"));
130+
break;
128131
default:
129132
debugPrint(F("Unknown Status"));
130133
break;
@@ -298,6 +301,9 @@ const char *ICM_20948::statusString(ICM_20948_Status_e stat)
298301
case ICM_20948_Stat_UnrecognisedDMPHeader2:
299302
return "Unrecognised DMP Header2";
300303
break;
304+
case ICM_20948_Stat_InvalDMPRegister:
305+
return "Invalid DMP Register";
306+
break;
301307
default:
302308
return "Unknown Status";
303309
break;
@@ -1055,7 +1061,7 @@ ICM_20948_Status_e ICM_20948::readDMPmems(unsigned short reg, unsigned int lengt
10551061
return ICM_20948_Stat_DMPNotSupported;
10561062
}
10571063

1058-
ICM_20948_Status_e ICM_20948::setDMPODRrate(enum inv_icm20948_sensor sensor, int rate)
1064+
ICM_20948_Status_e ICM_20948::setDMPODRrate(enum DMP_ODR_Registers odr_reg, int rate)
10591065
{
10601066
if (_device._dmp_firmware_available == true) // Should we attempt to set the DMP ODR?
10611067
{
@@ -1064,8 +1070,12 @@ ICM_20948_Status_e ICM_20948::setDMPODRrate(enum inv_icm20948_sensor sensor, int
10641070
// Value = (DMP running rate (225Hz) / ODR ) - 1
10651071
// E.g. For a 25Hz ODR rate, value= (225/25) - 1 = 8.
10661072

1067-
uint16_t period = (225 / rate) - 1;
1068-
status = inv_icm20948_set_dmp_sensor_period(&_device, sensor, period);
1073+
if (rate <= 0) // Check rate is valid
1074+
rate = 1;
1075+
if (rate > 225)
1076+
rate = 225;
1077+
uint16_t interval = (225 / rate) - 1;
1078+
status = inv_icm20948_set_dmp_sensor_period(&_device, odr_reg, interval);
10691079
return status;
10701080
}
10711081
return ICM_20948_Stat_DMPNotSupported;

src/ICM_20948.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,8 +206,7 @@ class ICM_20948
206206
ICM_20948_Status_e enableDMPSensorInt(enum inv_icm20948_sensor sensor, bool enable = true);
207207
ICM_20948_Status_e writeDMPmems(unsigned short reg, unsigned int length, const unsigned char *data);
208208
ICM_20948_Status_e readDMPmems(unsigned short reg, unsigned int length, unsigned char *data);
209-
ICM_20948_Status_e setDMPODRrate(enum inv_icm20948_sensor sensor, int rate);
210-
209+
ICM_20948_Status_e setDMPODRrate(enum DMP_ODR_Registers odr_reg, int rate);
211210
ICM_20948_Status_e readDMPdataFromFIFO(icm_20948_DMP_data_t *data);
212211

213212
};

src/util/ICM_20948_C.c

Lines changed: 88 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1362,23 +1362,27 @@ ICM_20948_Status_e inv_icm20948_read_mems(ICM_20948_Device_t *pdev, unsigned sho
13621362
return result;
13631363
}
13641364

1365-
ICM_20948_Status_e inv_icm20948_set_dmp_sensor_period(ICM_20948_Device_t *pdev, enum inv_icm20948_sensor sensor, uint16_t period)
1365+
ICM_20948_Status_e inv_icm20948_set_dmp_sensor_period(ICM_20948_Device_t *pdev, enum DMP_ODR_Registers odr_reg, uint16_t interval)
13661366
{
1367-
ICM_20948_Status_e result = ICM_20948_Stat_Ok;
1367+
// Set the ODR registersand clear the ODR counter
13681368

1369-
if (pdev->_dmp_firmware_available == false)
1370-
return ICM_20948_Stat_DMPNotSupported;
1369+
// In order to set an ODR for a given sensor data, write 2-byte value to DMP using key defined above for a particular sensor.
1370+
// Setting value can be calculated as follows:
1371+
// Value = (DMP running rate (225Hz) / ODR ) - 1
1372+
// E.g. For a 25Hz ODR rate, value= (225/25) -1 = 8.
13711373

1372-
uint8_t androidSensor = sensor_type_2_android_sensor(sensor);
1374+
// During run-time, if an ODR is changed, the corresponding rate counter must be reset.
1375+
// To reset, write 2-byte {0,0} to DMP using keys below for a particular sensor:
13731376

1374-
uint16_t delta = inv_androidSensor_to_control_bits[androidSensor];
1377+
ICM_20948_Status_e result = ICM_20948_Stat_Ok;
1378+
ICM_20948_Status_e result2 = ICM_20948_Stat_Ok;
13751379

1376-
if (delta == 0xFFFF)
1377-
return ICM_20948_Stat_SensorNotSupported;
1380+
if (pdev->_dmp_firmware_available == false)
1381+
return ICM_20948_Stat_DMPNotSupported;
13781382

13791383
unsigned char odr_reg_val[2];
1380-
odr_reg_val[0] = (unsigned char)(period >> 8);
1381-
odr_reg_val[1] = (unsigned char)(period & 0xff);
1384+
odr_reg_val[0] = (unsigned char)(interval >> 8);
1385+
odr_reg_val[1] = (unsigned char)(interval & 0xff);
13821386

13831387
unsigned char odr_count_zero[2] = {0x00, 0x00};
13841388

@@ -1394,76 +1398,86 @@ ICM_20948_Status_e inv_icm20948_set_dmp_sensor_period(ICM_20948_Device_t *pdev,
13941398
return result;
13951399
}
13961400

1397-
// Set the ODR registers and clear the ODR counters
1398-
1399-
// In order to set an ODR for a given sensor data, write 2-byte value to DMP using key defined above for a particular sensor.
1400-
// Setting value can be calculated as follows:
1401-
// Value = (DMP running rate (225Hz) / ODR ) - 1
1402-
// E.g. For a 25Hz ODR rate, value= (225/25) -1 = 8.
1403-
1404-
// During run-time, if an ODR is changed, the corresponding rate counter must be reset.
1405-
// To reset, write 2-byte {0,0} to DMP using keys below for a particular sensor:
1406-
1407-
if ((delta & DMP_Data_Output_Control_1_Compass_Calibr) > 0)
1408-
{
1409-
result |= inv_icm20948_write_mems(pdev, ODR_CPASS_CALIBR, 2, (const unsigned char *)&odr_reg_val);
1410-
result |= inv_icm20948_write_mems(pdev, ODR_CNTR_CPASS_CALIBR, 2, (const unsigned char *)&odr_count_zero);
1411-
}
1412-
if ((delta & DMP_Data_Output_Control_1_Gyro_Calibr) > 0)
1413-
{
1414-
result |= inv_icm20948_write_mems(pdev, ODR_GYRO_CALIBR, 2, (const unsigned char *)&odr_reg_val);
1415-
result |= inv_icm20948_write_mems(pdev, ODR_CNTR_GYRO_CALIBR, 2, (const unsigned char *)&odr_count_zero);
1416-
}
1417-
if ((delta & DMP_Data_Output_Control_1_Pressure) > 0)
1418-
{
1419-
result |= inv_icm20948_write_mems(pdev, ODR_PRESSURE, 2, (const unsigned char *)&odr_reg_val);
1420-
result |= inv_icm20948_write_mems(pdev, ODR_CNTR_PRESSURE, 2, (const unsigned char *)&odr_count_zero);
1421-
}
1422-
if ((delta & DMP_Data_Output_Control_1_Geomag) > 0)
1423-
{
1424-
result |= inv_icm20948_write_mems(pdev, ODR_GEOMAG, 2, (const unsigned char *)&odr_reg_val);
1425-
result |= inv_icm20948_write_mems(pdev, ODR_CNTR_GEOMAG, 2, (const unsigned char *)&odr_count_zero);
1426-
}
1427-
if ((delta & DMP_Data_Output_Control_1_PQuat6) > 0)
1428-
{
1429-
result |= inv_icm20948_write_mems(pdev, ODR_PQUAT6, 2, (const unsigned char *)&odr_reg_val);
1430-
result |= inv_icm20948_write_mems(pdev, ODR_CNTR_PQUAT6, 2, (const unsigned char *)&odr_count_zero);
1431-
}
1432-
if ((delta & DMP_Data_Output_Control_1_Quat9) > 0)
1433-
{
1434-
result |= inv_icm20948_write_mems(pdev, ODR_QUAT9, 2, (const unsigned char *)&odr_reg_val);
1435-
result |= inv_icm20948_write_mems(pdev, ODR_CNTR_QUAT9, 2, (const unsigned char *)&odr_count_zero);
1436-
}
1437-
if ((delta & DMP_Data_Output_Control_1_Quat6) > 0)
1438-
{
1439-
result |= inv_icm20948_write_mems(pdev, ODR_QUAT6, 2, (const unsigned char *)&odr_reg_val);
1440-
result |= inv_icm20948_write_mems(pdev, ODR_CNTR_QUAT6, 2, (const unsigned char *)&odr_count_zero);
1441-
}
1442-
if ((delta & DMP_Data_Output_Control_1_ALS) > 0)
1443-
{
1444-
result |= inv_icm20948_write_mems(pdev, ODR_ALS, 2, (const unsigned char *)&odr_reg_val);
1445-
result |= inv_icm20948_write_mems(pdev, ODR_CNTR_ALS, 2, (const unsigned char *)&odr_count_zero);
1446-
}
1447-
if ((delta & DMP_Data_Output_Control_1_Compass) > 0)
1448-
{
1449-
result |= inv_icm20948_write_mems(pdev, ODR_CPASS, 2, (const unsigned char *)&odr_reg_val);
1450-
result |= inv_icm20948_write_mems(pdev, ODR_CNTR_CPASS, 2, (const unsigned char *)&odr_count_zero);
1451-
}
1452-
if ((delta & DMP_Data_Output_Control_1_Gyro) > 0)
1401+
switch (odr_reg)
14531402
{
1454-
result |= inv_icm20948_write_mems(pdev, ODR_GYRO, 2, (const unsigned char *)&odr_reg_val);
1455-
result |= inv_icm20948_write_mems(pdev, ODR_CNTR_GYRO, 2, (const unsigned char *)&odr_count_zero);
1456-
}
1457-
if ((delta & DMP_Data_Output_Control_1_Accel) > 0)
1458-
{
1459-
result |= inv_icm20948_write_mems(pdev, ODR_ACCEL, 2, (const unsigned char *)&odr_reg_val);
1460-
result |= inv_icm20948_write_mems(pdev, ODR_CNTR_ACCEL, 2, (const unsigned char *)&odr_count_zero);
1403+
case DMP_ODR_Reg_Cpass_Calibr:
1404+
{
1405+
result = inv_icm20948_write_mems(pdev, ODR_CPASS_CALIBR, 2, (const unsigned char *)&odr_reg_val);
1406+
result2 = inv_icm20948_write_mems(pdev, ODR_CNTR_CPASS_CALIBR, 2, (const unsigned char *)&odr_count_zero);
1407+
}
1408+
break;
1409+
case DMP_ODR_Reg_Gyro_Calibr:
1410+
{
1411+
result = inv_icm20948_write_mems(pdev, ODR_GYRO_CALIBR, 2, (const unsigned char *)&odr_reg_val);
1412+
result2 = inv_icm20948_write_mems(pdev, ODR_CNTR_GYRO_CALIBR, 2, (const unsigned char *)&odr_count_zero);
1413+
}
1414+
break;
1415+
case DMP_ODR_Reg_Pressure:
1416+
{
1417+
result = inv_icm20948_write_mems(pdev, ODR_PRESSURE, 2, (const unsigned char *)&odr_reg_val);
1418+
result2 = inv_icm20948_write_mems(pdev, ODR_CNTR_PRESSURE, 2, (const unsigned char *)&odr_count_zero);
1419+
}
1420+
break;
1421+
case DMP_ODR_Reg_Geomag:
1422+
{
1423+
result = inv_icm20948_write_mems(pdev, ODR_GEOMAG, 2, (const unsigned char *)&odr_reg_val);
1424+
result2 = inv_icm20948_write_mems(pdev, ODR_CNTR_GEOMAG, 2, (const unsigned char *)&odr_count_zero);
1425+
}
1426+
break;
1427+
case DMP_ODR_Reg_PQuat6:
1428+
{
1429+
result = inv_icm20948_write_mems(pdev, ODR_PQUAT6, 2, (const unsigned char *)&odr_reg_val);
1430+
result2 = inv_icm20948_write_mems(pdev, ODR_CNTR_PQUAT6, 2, (const unsigned char *)&odr_count_zero);
1431+
}
1432+
break;
1433+
case DMP_ODR_Reg_Quat9:
1434+
{
1435+
result = inv_icm20948_write_mems(pdev, ODR_QUAT9, 2, (const unsigned char *)&odr_reg_val);
1436+
result2 = inv_icm20948_write_mems(pdev, ODR_CNTR_QUAT9, 2, (const unsigned char *)&odr_count_zero);
1437+
}
1438+
break;
1439+
case DMP_ODR_Reg_Quat6:
1440+
{
1441+
result = inv_icm20948_write_mems(pdev, ODR_QUAT6, 2, (const unsigned char *)&odr_reg_val);
1442+
result2 = inv_icm20948_write_mems(pdev, ODR_CNTR_QUAT6, 2, (const unsigned char *)&odr_count_zero);
1443+
}
1444+
break;
1445+
case DMP_ODR_Reg_ALS:
1446+
{
1447+
result = inv_icm20948_write_mems(pdev, ODR_ALS, 2, (const unsigned char *)&odr_reg_val);
1448+
result2 = inv_icm20948_write_mems(pdev, ODR_CNTR_ALS, 2, (const unsigned char *)&odr_count_zero);
1449+
}
1450+
break;
1451+
case DMP_ODR_Reg_Cpass:
1452+
{
1453+
result = inv_icm20948_write_mems(pdev, ODR_CPASS, 2, (const unsigned char *)&odr_reg_val);
1454+
result2 = inv_icm20948_write_mems(pdev, ODR_CNTR_CPASS, 2, (const unsigned char *)&odr_count_zero);
1455+
}
1456+
break;
1457+
case DMP_ODR_Reg_Gyro:
1458+
{
1459+
result = inv_icm20948_write_mems(pdev, ODR_GYRO, 2, (const unsigned char *)&odr_reg_val);
1460+
result2 = inv_icm20948_write_mems(pdev, ODR_CNTR_GYRO, 2, (const unsigned char *)&odr_count_zero);
1461+
}
1462+
break;
1463+
case DMP_ODR_Reg_Accel:
1464+
{
1465+
result = inv_icm20948_write_mems(pdev, ODR_ACCEL, 2, (const unsigned char *)&odr_reg_val);
1466+
result2 = inv_icm20948_write_mems(pdev, ODR_CNTR_ACCEL, 2, (const unsigned char *)&odr_count_zero);
1467+
}
1468+
break;
1469+
default:
1470+
result = ICM_20948_Stat_InvalDMPRegister;
1471+
break;
14611472
}
14621473

14631474
// result = ICM_20948_low_power(pdev, true); // Put chip into low power state
14641475
// if (result != ICM_20948_Stat_Ok)
14651476
// return result;
14661477

1478+
if (result2 > result)
1479+
result = result2; // Return the highest error
1480+
14671481
return result;
14681482
}
14691483

@@ -1526,7 +1540,7 @@ ICM_20948_Status_e inv_icm20948_enable_dmp_sensor_int(ICM_20948_Device_t *pdev,
15261540

15271541
if (state == 0)
15281542
delta = 0;
1529-
1543+
15301544
unsigned char data_intr_ctl[2];
15311545

15321546
data_intr_ctl[0] = (unsigned char)(delta >> 8);

0 commit comments

Comments
 (0)