This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TM4C123GH6PM: Dereferencing void *intfPtr on TivaC platform

Part Number: TM4C123GH6PM

Tool/software:

Hello,

I am porting bmm350 sensor code to Tiva-C platform.

https://github.com/boschsensortec/BMM350_SensorAPI

The authors took advantage of function pointers and cleverly designed structs to create a driver in c++ that can work in many platforms.

However, using tm4c123gh6pm and ccs there are some problems with the pointers. Here is an example:

static int8_t bmm350I2cReadData(uint8_t Reg, uint8_t *Data, uint32_t len, void *intfPtr) {
    uint8_t deviceAddr = *(uint8_t*)intfPtr;
    I2C3Receive(deviceAddr, Reg, Data, len);
    return 0;
}

The deviceAddr obtained by dereferencing void *intfPtr - is always wrong, although '*(uint8_t*)intfPtr' seems to be the correct syntax.

On the other side these parameters such as address is loaded as:

    uint8_t devAddr;
    switch(interface) {
        case eBmm350InterfaceI2C:
            devAddr = BMM350_I2C_ADSEL_SET_LOW; // 0x14
            bmm350Sensor.intfPtr = &devAddr;
            break;
        case eBmm350InterfaceI3C:
            break;
    }

The bmm350 device structure is as follows:

// brief bmm350 device structure
struct bmm350_dev {

     // The interface pointer is used to enable the user
     // to link their interface descriptors for reference during the
     // implementation of the read and write interfaces to the hardware.

    void* intfPtr;                                      // interface pointer
    uint8_t chipId;                                     // chip Id of BMM350
    pBmm350ReadFptr_t read;                             // Bus read function pointer
    pBmm350WriteFptr_t write;                           // Bus write function pointer
    pBmm350DelayUsFptr_t delayUs;                       // delay(in us) function pointer
    BMM350_INTF_RET_TYPE intf_rslt;                     // to store interface pointer error
    uint8_t axisEn;                                     // variable to store status of axes enabled
    struct bmm350_mag_compensate mag_comp;              // structure for mag compensate
    uint16_t otp_data[BMM350_OTP_DATA_LENGTH];          // array to store OTP data
    uint8_t var_id;                                     // variant ID
    bmm350_mraw_override_t mraw_override;               // magnetic reset and wait override
    uint8_t powerMode;                                  // power mode
};

Basically, the function pointers part work, but not the passing of values from pointers.

Any ideas / help greatly appreciated.

Best Regards,

C.