博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SPI设备驱动学习BUG问题记录
阅读量:2434 次
发布时间:2019-05-10

本文共 2594 字,大约阅读时间需要 8 分钟。

在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,将其不选中,编译内核下载结果成功创建,装载设备驱动也成功。

转载地址:http://axomb.baihongyu.com/

你可能感兴趣的文章
java_中介者模式
查看>>
java_备忘录模式
查看>>
多线程——背景了解
查看>>
power designer使Comment与Name相同.txt
查看>>
学习Spring 开发指南------基础语义
查看>>
IE下的图片空隙间距BUG和解决办法
查看>>
[pb]从excel导入数据到datawindow
查看>>
CSS Padding in Outlook 2007 and 2010
查看>>
有关内存的思考题
查看>>
What is the difference between gross sales and revenue?
查看>>
Dreamweaver默认打开后缀名为ftl的文件时
查看>>
LNMP一键安装
查看>>
几个分析函数的比较
查看>>
主流算法:
查看>>
RMI
查看>>
J.U.C之Future
查看>>
缓存思想分析
查看>>
一致性hash
查看>>
J.U.C之ConcurrentHashMap分析
查看>>
J.U.C之CopyOnWriteArrayList
查看>>