SPI设备驱动学习BUG问题记录

来源:互联网 发布:mac phpmyadmin 安装 编辑:程序博客网 时间:2024/05/17 23:27

在17.2.20日的问题进行长达一天多的反复调试,终于在22日得到了解决。
以及oled的驱动的编写,在进行驱动的调试过程中,

spi_register_board_info注册硬件信息遇到了无法创建设备。spi_register_board_infospi_match_master_to_boardinfospi_new_devicespi_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,将其不选中,编译内核下载结果成功创建,装载设备驱动也成功。

1 0