1693|0

1140

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

SPI设备驱动学习BUG问题记录 [复制链接]

以及oled的驱动的编写,在进行驱动的调试过程中,


spi_register_board_info注册硬件信息遇到了无法创建设备。
spi_register_board_info
spi_match_master_to_boardinfo
spi_new_device
spi_add_device
/* Chipselects are numbered 0..max; validate. */
    if (spi->chip_select >= spi->master->num_chipselect) {
        dev_err(dev, "cs%d >= max %d\n",
            spi->chip_select,
            spi->master->num_chipselect);
        return -EINVAL;
    }//打印错误信息,css>=max 1,意为用户的使用片选数量大于master的数量支持

阅读内核源码进行错误信息调试
错误调试过程:
首先通过打印log信息定位错误,但开始由于对整个文件不是很熟悉,因此问题的定位一直停留在对自己编写的设备文件和驱动文件,以及spi_master文件spi_s3c64xx.c文件中打印log。
1.发现spi__info.c文件的入口函数spi_register_board_info文件被调用,但是在master文件bus_num进行匹配成功文件创建过程spi_add_device中一直出现误信息,css>=max 1,
2.此时考虑是设备spi_master驱动文件spi_s3c64xx.c文件对应的设备出现错误,但是由于开始对内核文件的不熟悉,所以导致一直认为spi_master的设备文件在mach-itop4412.c中,所以错误一直被延续,无进展。
3.通过对韦老师的spi视频的第3课第4节SPI_OLED驱动编译安装_P的观看,大致确定与pi_master驱动文件spi_s3c64xx.c文件对应的设备文件在arm/mach-exynos/dev-spi.c,通过对这个文件的仔细分析,发现在6410以后的在进行spi的master设备信息描述时,未使用bus_num和num_cs。


static struct s3c64xx_spi_info exynos_spi2_pdata = {
    .cfg_gpio = exynos_spi_cfg_gpio,
    .fifo_lvl_mask = 0x7f,
    .rx_lvl_offset = 15,
    .high_speed = 1,
    .clk_from_cmu = true,
    .tx_st_done = 25,   
};
struct platform_device exynos_device_spi2 = {
    .name         = "s3c64xx-spi",
    .id       = 2,
    .num_resources    = ARRAY_SIZE(exynos_spi2_resource),
    .resource     = exynos_spi2_resource,
    .dev = {
        .dma_mask       = &spi_dmamask,
        .coherent_dma_mask  = DMA_BIT_MASK(32),
        .platform_data = &exynos_spi2_pdata,
    },
};

4.但是为什么在master匹配成功调用spi_s3c64xx.c的probe函数还可以实现master->num_chipselect = sci->num_cs;于是我进行了打印log查看,当我修改exynos_spi2_pdata结构体的成员,为它添加bus_num,num_cs,但是发现num_cs的值是1,exynos_spi2_pdata其他成员修改后都可以改变,但是无论我如何修改都是1.
5.于是我在arm/mach-exynos/dev-spi.c目录仔细观察,发现这里的设备信息是如何注册到内核中的了,唯一的可能就是mach-itop4412.c中了,但是mach-itop4412.c有很多条件编译很复杂,找了很久都未发现其注册spi结构体的信息,于是我全局搜索exynos_device_spi2 发现在mach-itop4412.c被放入一个platform_device数组smdk4x12_devices中,调用集中注册。但是这样的思路就很清晰了。
6.但是我打印probe中的num_cs为什么不变了,这个问题让我很不能理解。在反复考虑平台设备注册后哪里可能被修改。无果后,
7.我在arch/arm/plat-samsung/include/plat/s3c64xx-spi.h文件中将struct s3c64xx_spi_info结构体成员num_cs删除,编译发现 probe函数中报错,当一个关键错误提醒了我arm/mach-exynos/dev-spi.c305行出错 error: ‘struct s3c64xx_spi_info’ has no member named ‘num_cs’
发现arm/mach-exynos/dev-spi.c中有一个函数exynos_spi_set_info居然被调用过,于是全局搜索发现在mach-itop4412.c中调用过将exynos_spi_set_info(2, EXYNOS_SPI_SRCCLK_SCLK,ARRAY_SIZE(spi2_csi));将num-_cs设备为1,因而无论如何num_cs的值都无法被修改,都为1.
至此问题解决,但是在注册spi设备时提示cs0已经被使用,经过搜索发现一个spi设备SPI_RC522使用了该设备,于是我在make menuconfig中查找CONFIG_SPI_RC522,将其不选中,编译内核下载结果成功创建,装载设备驱动也成功。

点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表