首页 > 解决方案 > 结构分配大小中断 spi_sync_transfer

问题描述

我正在玩树莓派上的linux spi 驱动程序。使用逻辑分析仪,我可以观察总线上发生的情况。我的问题是,如果我更改为spi_transferstruct 分配的内存大小,则不会传输任何内容:

总而言之,下面的代码适用于 kmalloc(sizeof(struct spi_transfer)*1,GFP_KERNEL);但不适用于kmalloc(sizeof(struct spi_transfer)*2,GFP_KERNEL);

我正在使用带有 Raspbian 的 Raspberry PI 3。我的内核版本是 4.19.64。

union command_u
{
    uint8_t buf[4];
    uint32_t u32;
};
uint16_t ads8661_read(uint16_t address)
{
    address &= 0x01fc;
    uint32_t ret0;
    union command_u ret;
    union command_u payload = {.buf = {0xc8 | (address >> 8), address, 0x00, 0x00}};

    struct spi_transfer * trans_array= kmalloc(sizeof(struct spi_transfer)*1,GFP_KERNEL);

    if(trans_array){
        printk(KERN_NOTICE "Malloc Worked :)");
        trans_array[0].tx_buf = &payload;
        trans_array[0].rx_buf = &ret;
        trans_array[0].len = sizeof(payload);
        spi_sync_transfer(spi_dev,trans_array,1);
        kfree(trans_array);

    }else{
        printk(KERN_ALERT "Malloc Failed :/");
    }
    return 0;
}

我假设内存分配不会失败,因为我在执行时看到Malloc Worked :)dmesg。我也试过分配 3*sizeof(spi_transfer),也没有用。

我试图分配2个spi_transfer并将函数的spi_transfer的参数号修改spi_sync_transfer为2,但也没有用。

欢迎任何反馈或建议

编辑:我也尝试分配和使用 2spi_transfer

union command_u
{
    uint8_t buf[4];
    uint32_t u32;
};
uint16_t ads8661_read(uint16_t address)
{
    address &= 0x01fc;
    uint32_t ret0;
    union command_u ret;
    union command_u payload = {.buf = {0xc8 | (address >> 8), address, 0x00, 0x00}};
    union command_u payload_nop = {.u32 = 0x00000000};

    struct spi_transfer * trans_array = kmalloc_array(2,sizeof(struct spi_transfer),GFP_KERNEL);

    if(trans_array){
        printk(KERN_NOTICE "Malloc Worked :)");

        trans_array[0].tx_buf = &payload;
        trans_array[0].rx_buf = &ret0;
        trans_array[0].len = sizeof(payload);

        trans_array[1].tx_buf = &payload_nop;
        trans_array[1].rx_buf = &ret;
        trans_array[1].len = sizeof(payload);

        spi_sync_transfer(ads8661_device.spi_dev,trans_array,2);
        kfree(trans_array);

    }else{
        printk(KERN_ALERT "Malloc Failed :/");
    }

    // Invert endianness
    return ((uint16_t)ret.buf[0] << 8) | ret.buf[1];
}

标签: clinux-kernellinux-device-driverraspberry-pi3spi

解决方案


推荐阅读