SPI設備驅動學習BUG問題記錄

在17.2.20日的問題進行長達一天多的反覆調試,終於在22日得到了解決。
以及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,將其不選中,編譯內核下載結果成功創建,裝載設備驅動也成功。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章