三 s5p4418对mcp2515 can总线的支持
對于mcp2515的移植相關(guān)知識課先參考這里http://blog.csdn.net/sno_guo/article/details/17029295
下面是針對s5p4418官方提供的內(nèi)核為基礎(chǔ)做的相關(guān)修改。
對于2515的驅(qū)動我們不用關(guān)心,直接使用內(nèi)核自帶的即可。首先我們需要對內(nèi)核的配置做添加,具體如下面的圖所示:
務(wù)必確保內(nèi)核的配置中上面圖片的選擇是被打開的,免得做其他工作時造成未知的問題。
下面是修改板級目錄下device.c的文件,找到下面的代碼,并修改成如下所示:
/*------------------------------------------------------------------------------* SSP/SPI*/ #if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE) #include <linux/spi/spi.h> #include <linux/can/platform/mcp251x.h> static void spi0_cs(u32 chipselect) {//printk("ERTER:%s ......\n",__func__); #if (CFG_SPI0_CS_GPIO_MODE)if(nxp_soc_gpio_get_io_func( CFG_SPI0_CS )!= nxp_soc_gpio_get_altnum( CFG_SPI0_CS))nxp_soc_gpio_set_io_func( CFG_SPI0_CS, nxp_soc_gpio_get_altnum( CFG_SPI0_CS));nxp_soc_gpio_set_io_dir( CFG_SPI0_CS,1);nxp_soc_gpio_set_out_value( CFG_SPI0_CS , chipselect); #else; #endif } struct pl022_config_chip spi0_info = {/* available POLLING_TRANSFER, INTERRUPT_TRANSFER, DMA_TRANSFER */.com_mode = CFG_SPI0_COM_MODE,.iface = SSP_INTERFACE_MOTOROLA_SPI,/* We can only act as master but SSP_SLAVE is possible in theory */.hierarchy = SSP_MASTER,/* 0 = drive TX even as slave, 1 = do not drive TX as slave */.slave_tx_disable = 1, .rx_lev_trig = SSP_RX_4_OR_MORE_ELEM,.tx_lev_trig = SSP_TX_4_OR_MORE_EMPTY_LOC,.ctrl_len = SSP_BITS_8,.wait_state = SSP_MWIRE_WAIT_ZERO,.duplex = SSP_MICROWIRE_CHANNEL_FULL_DUPLEX,/** This is where you insert a call to a function to enable CS* (usually GPIO) for a certain chip.*/ #if (CFG_SPI0_CS_GPIO_MODE).cs_control = spi0_cs, #endif.clkdelay = SSP_FEEDBACK_CLK_DELAY_1T,}; void s5p4418_mcp2515_init(void) {printk("ERTER:%s ......\n",__func__);nxp_soc_gpio_set_io_func(PAD_GPIO_C+ 30, 0); nxp_soc_gpio_set_io_func(PAD_GPIO_C+ 29, 1); nxp_soc_gpio_set_io_func(PAD_GPIO_D+ 0, 1); nxp_soc_gpio_set_io_func(PAD_GPIO_C+ 31, 1); nxp_soc_gpio_set_io_func(PAD_GPIO_B+ 6, 0); } static struct mcp251x_platform_data mcp251x_info = {.oscillator_frequency = 20 * 1000 * 1000,.board_specific_setup = &s5p4418_mcp2515_init,.power_enable = NULL,.transceiver_enable = NULL, }; static struct spi_board_info spi_plat_board[] __initdata = { #ifdef CONFIG_CAN_MCP251X[0] = {.modalias = "mcp2515", /* fixup */.max_speed_hz = 1 * 1000 * 1000, /* max spi clock (SCK) speed in HZ */.bus_num = 0, /* Note> set bus num, must be smaller than ARRAY_SIZE(spi_plat_device) */.chip_select = 0, /* Note> set chip select num, must be smaller than spi cs_num */.controller_data = &spi0_info,.mode = SPI_MODE_0,.platform_data = &mcp251x_info,.irq = PB_PIO_IRQ(CFG_IO_CAN_DETECT),}, #else[0] = {.modalias = "spidev", /* fixup */.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */.bus_num = 0, /* Note> set bus num, must be smaller than ARRAY_SIZE(spi_plat_device) */.chip_select = 0, /* Note> set chip select num, must be smaller than spi cs_num */.controller_data = &spi0_info,.mode = SPI_MODE_3 | SPI_CPOL | SPI_CPHA,}, #endif };#endif相對于源碼主要做的修改是:
1.spi_plat_board結(jié)構(gòu)體增加了對mcp2515的定義
2.添加mcp251x_info結(jié)構(gòu)定義
3.添加void s5p4418_mcp2515_init(void)函數(shù)
這里說明一下void s5p4418_mcp2515_init(void)函數(shù)的意義,該函數(shù)是對SPI0的GPIO做了配置,在默認的情況下SPI0的GPIO不一定為SPI的功能,所以這里務(wù)必需要重新配置一下(由于開始沒注意,導(dǎo)致了無法初始化的問題),當(dāng)然這個配置工作也可以在其他的地方做。
CFG_IO_CAN_DETECT這個定義是在板級目錄的include目錄下cfg_main.h文件中,這里定義的是GPIOB6引腳。
做了上面的配置之后初始化就應(yīng)該沒有問題了。
使用ifconfig can0 up進行檢測,如果不報錯那么與mcp2515的通信是沒有問題了。
剩下的就可以使用ip、candump等命令進行 can操作了。
希望對移植can遇到問題的朋友有所幫助。
總結(jié)
以上是生活随笔為你收集整理的三 s5p4418对mcp2515 can总线的支持的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 4.4 Kitkat 使
- 下一篇: 二 关于s5p4418 无线wifi模块