C 结构分配大小中断spi\U同步\U传输
我在玩覆盆子圆周率。使用逻辑分析仪,我可以观察总线上发生的情况。我的问题是,如果我更改为C 结构分配大小中断spi\U同步\U传输,c,linux-kernel,linux-device-driver,raspberry-pi3,spi,C,Linux Kernel,Linux Device Driver,Raspberry Pi3,Spi,我在玩覆盆子圆周率。使用逻辑分析仪,我可以观察总线上发生的情况。我的问题是,如果我更改为spi\u传输分配的内存大小struct: 总之,下面的代码可以很好地用于 kmalloc(sizeof(struct spi_transfer)*1,GFP_内核)但不使用kmalloc(sizeof(struct spi_transfer)*2,GFP_内核) 我用的是树莓皮3和树莓皮。我的内核版本是4.19.64 union command_u { uint8_t buf[4]; uin
spi\u传输分配的内存大小
struct:
总之,下面的代码可以很好地用于
kmalloc(sizeof(struct spi_transfer)*1,GFP_内核)代码>但不使用kmalloc(sizeof(struct spi_transfer)*2,GFP_内核)代码>
我用的是树莓皮3和树莓皮。我的内核版本是4.19.64
union command_u
{
uint8_t buf[4];
uint32_t u32;
};
我假设内存分配没有失败,因为我看到Malloc工作:)当我执行dmesg
时。
我也试过分配3*sizeof(spi_传输),但也没用
我试图分配2个spi_传输,并将spi_sync_transfer
函数的spi_传输的参数号修改为2,但也不起作用
欢迎任何反馈或建议
编辑:
我还尝试分配和使用2spi\u传输
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];
}
union命令
{
uint8_t buf[4];
uint32_t u32;
};
uint16\u t ads8661\u读取(uint16\u t地址)
{
地址&=0x01fc;
uint32_t ret0;
联合司令部;
union命令_payload={.buf={0xc8 |(地址>>8),地址0x00,0x00};
联合命令\u有效载荷\u nop={.u32=0x00000000};
struct spi_transfer*trans_array=kmalloc_数组(2,sizeof(struct spi_transfer),GFP_内核);
if(trans_数组){
printk(KERN_通知“Malloc工作:”);
trans_数组[0]。tx_buf=&有效负载;
trans_数组[0]。rx_buf=&ret0;
trans_数组[0]。len=sizeof(有效负载);
trans_数组[1]。tx_buf=&payload\u nop;
trans_数组[1]。rx_buf=&ret;
trans_数组[1]。len=sizeof(有效负载);
spi_同步_传输(ads8661_device.spi_dev,trans_array,2);
kfree(trans_数组);
}否则{
printk(KERN_警报“Malloc Failed:/”);
}
//反向端度
return((uint16_t)ret.buf[0]您必须更新spi_sync_传输(spi_dev,trans_array,2);
(注意这里有2个)。但要做到这一点,自动为这两个使用临时变量。unsigned int amount=2;…x=kcaloc(amount,…);spi sync_传输(…,amount);
。注意kmalloc array()/kcaloc()
也是。是的,您必须填充所有传输。否则您将得到一些垃圾(特别是在使用非零分配时)。希望您也在填充传输数组[1]
的成员。如何声明有效负载
和ret
以及接收buf
设置(可能是trans\u数组[1]
的tx\u buf设置)与trans\u数组[0]的设置不同
?我试着像@0andriy所说的那样分配和使用2spi\u传输
,但它也不起作用。对于payload和ret,我编辑了原始帖子。我没有为spi\u传输
设置任何参数。我只是将spi\u设备的速度限制在1500 Hz,以便观察逻辑分析上的信号r、 您必须更新spi_sync_transfer(spi_dev,trans_array,2);
(此处的注释2)。但要做到这一点,自动为两者使用临时变量。unsigned int amount=2;…x=kcaloc(amount,…);spi_sync_transfer(…,amount);
。注意kmalloc_array()/kcaloc()
也是。是的,您必须填充所有传输。否则您将得到一些垃圾(特别是在使用非零分配时)。希望您也在填充传输数组[1]
的成员。如何声明有效负载
和ret
以及接收buf
设置(可能是trans\u数组[1]
的tx\u buf设置)与trans\u数组[0]的设置不同
?我试着像@0andriy所说的那样分配和使用2spi\u传输
,但它也不起作用。对于payload和ret,我编辑了原始帖子。我没有为spi\u传输
设置任何参数。我只是将spi\u设备的速度限制在1500 Hz,以便观察逻辑分析上的信号R
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];
}