分享Kernel 几个常用的Spi Log调试方法。
平台文件: spi.c
/kernel-4.4/drivers/spi/spi.c ---- 这个是抽象出来的通用接口
spi_drv_probe struct spi_driver
Dts的spi组配置
在刚开始调试时, 降低spi的频率,分平台:
高通平台, 是一个4-5个不同阶段的频率数组,只能选择组,不能指定具体的。
比如:drivers/clk/qcom/gcc-msm8916.c
static const struct freq_tbl ftbl_blsp1_qup1_spi_apps_clk_src[] = {
F(960000, P_XO, 10, 1, 2),
F(4800000, P_XO, 4, 0, 0),
F(9600000, P_XO, 2, 0, 0),
F(15000000, P_GPLL0, 10, 1, 4),
F(19200000, P_XO, 1, 0, 0),
F(25000000, P_GPLL0, 12, 1, 2),
F(50000000, P_GPLL0, 12, 0, 0),
{ }
};
MTK,在老的平台里,通过spi struct mt_chip_conf结构体里修改;新的平台,在mtk_spi.c平台
文件下修改,mt_chip_conf结构体有变化。
注意下CS的配置,是高High还是低Low有效,一般情况下,在结构体中可修改。高通Mtk有点不同。
spi->mode = spi->mode|
Spi的Tee权限组问题,现在高通,MTK,都对spi配置了Tee的权限限制。高通比较灵活,可以代码
修改对应的spi index组。MTK就做的比较死,限死哪几组,所以在选型时,需要特别注意,否则无法
通过软件修改。
Spi的DMA访问问题,在新的kernel版本中,需要关注DMA的申请类型Flag。
Spi的数据线主从方向要接对,了解从芯片的规格。是MISO对MISO,还是MISO对MOSI。
内核中,有一个专门用来Debug的 spi dev0 设备可以测试用。比如MTK平台的spi-mt65xx-dev.c
struct spi_device_id spi_id_table[] = { {"spi-ut", 0},
static DEVICE_ATTR(spi, 0200, NULL, spi_store);
static DEVICE_ATTR(spi_msg, 0200, NULL, spi_msg_store);
如果碰到一些奇怪的问题,最简单实用的办法,是抓一个波形,来分析,看下clk,data等信号
系统有32位和64位兼容,需要同时增加,举例如下:
.unlocked_ioctl = test_ioctl,
.compat_ioctl = compat_ioctl, // 32位
需要修改的是指针类型,
typedef struct {
smart_cmd_t cmd;
int type;
u32 inlen;
u32 inbuf;
u32 outlen;
u32 outbuf; };
if (copy_from_user(&data, (void __user *)arg, sizeof(smart_cmd_t)))
{
TEST_ERR("copy from user failed!\n");
return ERR_COPY_FROM_USER;
}
p_com_data = (smartcard_com_data_t __user *)arg;
//err = get_user(data.cmd, &(p_com_data->cmd));
err |= get_user(data.type, &(p_com_data->type));
err |= get_user(data.inlen, &(p_com_data->inlen));
err |= get_user(p, &(p_com_data->inbuf));