在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,將其不選中,編譯內核下載結果成功創建,裝載設備驅動也成功。