c - 结构分配大小中断 spi_sync_transfer
问题描述
我正在玩树莓派上的linux spi 驱动程序。使用逻辑分析仪,我可以观察总线上发生的情况。我的问题是,如果我更改为spi_transfer
struct 分配的内存大小,则不会传输任何内容:
总而言之,下面的代码适用于
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];
}
解决方案
推荐阅读
- c# - 为什么 IServerStreamWriter 不发送通知响应?
- go - 无法将接口切片传递给空白接口类型函数
- php - POST 请求出现空白,为什么?
- react-native - 嵌套导航 SwitchNavigator>DrawerNavigator>TabsNavigator>StackNavigator
- ios - 在 ios 上仅数据消息时不调用 onMessage
- pointers - 如何编写一个在fortran中返回分配的共享内存数组的函数?
- javascript - 我要框上方的按钮加上时间
- python - 如何在 json 中打印时添加双引号?目前我得到单引号
- apache-nifi - Nifi 处理器根据可变的正则表达式列表路由流
- javascript - 谷歌地图地理编码意外的财产位置