硬件:华天正科技S3C6410开发板(
板子上已集成一路CAN总线,使用mcp2515,驱动已添加)+外扩MCP2515CAN模块

目的:(1)想在S3C6410上在添加一路CAN总线,形成两路CAN总线,一路传输速率高,一路传输速率低。
(2)两路CAN总线复用MISO(输出),MOSI(输出),CLK(时钟),而片选(CS)和中断(INT)单独设置,通过片选拉低,来选择哪路用来通信。(不知是否可行)
(3)
在板子上/dev目录下可以看见mcp2515设备文件,我想在添加一个mcp2515驱动,在/dev目录下形成mcp2515和mcp2515high两个设备文件
因为mcp2515驱动板子已经自带,
我主要不知道(在哪添加以及如何添加)一个mcp2515驱动
问题:(1)板子上已经设计一路CAN:通过参看/arch/arm/mach-s3c6410/mach-smdk6410.c中对板子上已添加mcp2515的片选,中断,时钟加以定义
#if defined(CONFIG_SPI_CNTRLR_0)
static struct s3c_spi_pdata s3c_slv_pdata_0[] __initdata = {
[0] = { /* Slave-0 */
.cs_level = CS_FLOAT,
.cs_pin = S3C64XX_GPC(3),
.cs_mode = S3C64XX_GPC_OUTPUT(3),
.cs_set = s3c_cs_set,
.cs_config = s3c_cs_config,
.cs_suspend = s3c_cs_suspend,
.cs_resume = s3c_cs_resume,
},
[1] = { /* Slave-1 */
.cs_level = CS_FLOAT,
.cs_pin = S3C64XX_GPF(13),
.cs_mode = S3C64XX_GPF_OUTPUT(13),
.cs_set = s3c_cs_setF13,
.cs_config = s3c_cs_configF13,
.cs_suspend = s3c_cs_suspend,
.cs_resume = s3c_cs_resume,
},
};
#endif
#if defined(CONFIG_SPI_CNTRLR_1)
static struct s3c_spi_pdata s3c_slv_pdata_1[] __initdata = {
[0] = { /* Slave-0 */
.cs_level = CS_FLOAT,
.cs_pin = S3C64XX_GPC(7),
.cs_mode = S3C64XX_GPC_OUTPUT(7),
.cs_set = s3c_cs_set,
.cs_config = s3c_cs_config,
.cs_suspend = s3c_cs_suspend,
.cs_resume = s3c_cs_resume,
},
[1] = { /* Slave-1 */
.cs_level = CS_FLOAT,
.cs_pin = S3C64XX_GPF(14),
.cs_mode = S3C64XX_GPF_OUTPUT(14),
.cs_set = s3c_cs_setF14,
.cs_config = s3c_cs_configF14,
.cs_suspend = s3c_cs_suspend,
.cs_resume = s3c_cs_resume,
},
[2] = { /* Slave-2 */
.cs_level = CS_FLOAT,
.cs_pin = S3C64XX_GPF(15),
.cs_mode = S3C64XX_GPF_OUTPUT(15),
.cs_set = s3c_cs_setF15,
.cs_config = s3c_cs_configF15,
.cs_suspend = s3c_cs_suspend,
.cs_resume = s3c_cs_resume,
},
};
#endif
/*
* CAN Port
*/
#if defined(
CONFIG_CAN_MCP2515)
void s3c6410_mcp2515_init(void)
{
// printk("%s:%d\n",__FUNCTION__,__LINE__);
s3c_gpio_cfgpin(S3C64XX_GPC(0), S3C64XX_GPC0_SPI_MISO0);
s3c_gpio_cfgpin(S3C64XX_GPC(1), S3C64XX_GPC1_SPI_CLK0);
s3c_gpio_cfgpin(S3C64XX_GPC(2), S3C64XX_GPC2_SPI_MOSI0);
s3c_gpio_cfgpin(S3C64XX_GPC(3), S3C64XX_GPC3_SPI_nCS0);
s3c_gpio_cfgpin(S3C64XX_GPC(7), S3C64XX_GPC7_EINT_G2_7);
s3c_cs_config(S3C64XX_GPC(5), S3C64XX_GPC_OUTPUT(5),CS_LOW);
s3c_cs_set(S3C64XX_GPC(5),CS_LOW);
// printk("%s:%d\n",__FUNCTION__,__LINE__);
}
static struct mcp251x_platform_data mcp251x_data =
{
.f_osc = 8 * 1000 * 1000,
.platform_init = s3c6410_mcp2515_init,
};
#endif
static struct spi_board_info s3c_spi_devs[] __initdata = {
#if defined(
CONFIG_SPI_CNTRLR_0)
[0] = {
#if defined(CONFIG_CAN_MCP2515)
.modalias = "
mcp2515",
.chip_select = 0,
.irq = IRQ_EINT_GROUP(2,7),
.platform_data = &mcp251x_data,
.max_speed_hz = 100000,
.bus_num = 0,
.mode = SPI_MODE_0,//0,
#else
.modalias = "spidev", /* Test Interface */
.mode = SPI_MODE_0, /* CPOL=0, CPHA=0 */
.max_speed_hz = 100000,
/* Connected to SPI-0 as 1st Slave */
.bus_num = 0,
.irq = IRQ_SPI0,
.chip_select = 0,
#endif
},
[1] = {
.modalias = "spidev", /* Test Interface */
.mode = SPI_MODE_0, /* CPOL=0, CPHA=0 */
.max_speed_hz = 100000,
/* Connected to SPI-0 as 2nd Slave */
.bus_num = 0,
.irq = IRQ_SPI0,
.chip_select = 1,
},
#endif
#if defined(CONFIG_SPI_CNTRLR_1)
[2] = {
.modalias = "spidev", /* Test Interface */
.mode = SPI_MODE_0, /* CPOL=0, CPHA=0 */
.max_speed_hz = 100000,
/* Connected to SPI-1 as 1st Slave */
.bus_num = 1,
.irq = IRQ_SPI1,
.chip_select = 0,
},
[3] = {
.modalias = "spidev", /* Test Interface */
.mode = SPI_MODE_0, /* CPOL=0, CPHA=0 */
.max_speed_hz = 100000,
/* Connected to SPI-1 as 2nd Slave */
.bus_num = 1,
.irq = IRQ_SPI1,
.chip_select = 1,
},
[4] = {
.modalias = "mmc_spi", /* MMC SPI */
.mode = SPI_MODE_0 | SPI_CS_HIGH, /* CPOL=0, CPHA=0 & CS is Active High */
.max_speed_hz = 100000,
/* Connected to SPI-1 as 3rd Slave */
.bus_num = 1,
.irq = IRQ_SPI1,
.chip_select = 2,
},
#endif
};
(2)在 linux/driver/net/can目录下的mcp2515.c驱动程序
我认为只需修改 设备名称#define DRIVER_NAME "
mcp2515"
使之与smdk6410.c中的#if defined(CONFIG_CAN_MCP2515)
.modalias = "
mcp2515",
.chip_select = 0,
.irq = IRQ_EINT_GROUP(2,7),
.platform_data = &mcp251x_data,
.max_speed_hz = 100000,
.bus_num = 0,
.mode = SPI_MODE_0,//0,
相对应即可。
以下为小弟修改的smdk6410.c 目的为在添加一个驱动,使之在ARM开发板上新生成一个mcp2515h新设备。
说明:
GPF(5)--为片选 GPF(6)--为中断 红色为新添加程序
#if defined(CONFIG_SPI_CNTRLR_0)
static struct s3c_spi_pdata s3c_slv_pdata_0[] __initdata = {
[0] = { /* Slave-0 */
.cs_level = CS_FLOAT,
.cs_pin = S3C64XX_GPC(3),
.cs_mode = S3C64XX_GPC_OUTPUT(3),
.cs_set = s3c_cs_set,
.cs_config = s3c_cs_config,
.cs_suspend = s3c_cs_suspend,
.cs_resume = s3c_cs_resume,
},
[1] = { /* change time:2013-5-31 12:25:18 */
.cs_level = CS_FLOAT,
.cs_pin = S3C64XX_GPF(5),
.cs_mode = S3C64XX_GPF_OUTPUT(5),
.cs_set = s3c_cs_set,
.cs_config = s3c_cs_config,
.cs_suspend = s3c_cs_suspend,
.cs_resume = s3c_cs_resume,
},
[2] = { /* Slave-1 */
.cs_level = CS_FLOAT,
.cs_pin = S3C64XX_GPF(13),
.cs_mode = S3C64XX_GPF_OUTPUT(13),
.cs_set = s3c_cs_setF13,
.cs_config = s3c_cs_configF13,
.cs_suspend = s3c_cs_suspend,
.cs_resume = s3c_cs_resume,
},
};
#endif
#if defined(CONFIG_SPI_CNTRLR_1)
static struct s3c_spi_pdata s3c_slv_pdata_1[] __initdata = {
[0] = { /* Slave-0 */
.cs_level = CS_FLOAT,
.cs_pin = S3C64XX_GPC(7),
.cs_mode = S3C64XX_GPC_OUTPUT(7),
.cs_set = s3c_cs_set,
.cs_config = s3c_cs_config,
.cs_suspend = s3c_cs_suspend,
.cs_resume = s3c_cs_resume,
},
[1] = { /* Slave-1 */
.cs_level = CS_FLOAT,
.cs_pin = S3C64XX_GPF(14),
.cs_mode = S3C64XX_GPF_OUTPUT(14),
.cs_set = s3c_cs_setF14,
.cs_config = s3c_cs_configF14,
.cs_suspend = s3c_cs_suspend,
.cs_resume = s3c_cs_resume,
},
[2] = { /* Slave-2 */
.cs_level = CS_FLOAT,
.cs_pin = S3C64XX_GPF(15),
.cs_mode = S3C64XX_GPF_OUTPUT(15),
.cs_set = s3c_cs_setF15,
.cs_config = s3c_cs_configF15,
.cs_suspend = s3c_cs_suspend,
.cs_resume = s3c_cs_resume,
},
};
#endif
/*
* CAN Port
*/
#if defined(CONFIG_CAN_MCP2515)
void s3c6410_mcp2515_init(void)
{
// printk("%s:%d\n",__FUNCTION__,__LINE__);
s3c_gpio_cfgpin(S3C64XX_GPC(0), S3C64XX_GPC0_SPI_MISO0); //SPI0_MISO
s3c_gpio_cfgpin(S3C64XX_GPC(1), S3C64XX_GPC1_SPI_CLK0); //SPI0_CLK
s3c_gpio_cfgpin(S3C64XX_GPC(2), S3C64XX_GPC2_SPI_MOSI0); //SPI0_MOSI
s3c_gpio_cfgpin(S3C64XX_GPC(3), S3C64XX_GPC3_SPI_nCS0); //SPI0_CS
//s3c_gpio_cfgpin(S3C64XX_GPC(3), S3C64XX_GPC3_SPI_nCS0);
s3c_gpio_cfgpin(S3C64XX_GPC(7), S3C64XX_GPC7_EINT_G2_7); //CAN_INT
s3c_cs_config(S3C64XX_GPC(5), S3C64XX_GPC_OUTPUT(5),CS_LOW); //CAN_MODE
s3c_cs_set(S3C64XX_GPC(5),CS_LOW);
// printk("%s:%d\n",__FUNCTION__,__LINE__);
}
static struct mcp251x_platform_data mcp251x_data =
{
.f_osc = 8 * 1000 * 1000,
.platform_init = s3c6410_mcp2515_init,
};
#endif
//change time:2013-5-31 11:00:43
void s3c6410_mcp2515l_init(void)
{
// printk("%s:%d\n",__FUNCTION__,__LINE__);
s3c_gpio_cfgpin(S3C64XX_GPC(0), S3C64XX_GPC0_SPI_MISO0); //SPI0_MISO
s3c_gpio_cfgpin(S3C64XX_GPC(1), S3C64XX_GPC1_SPI_CLK0); //SPI0_CLK
s3c_gpio_cfgpin(S3C64XX_GPC(2), S3C64XX_GPC2_SPI_MOSI0); //SPI0_MOSI
s3c_gpio_cfgpin(S3C64XX_GPF(5), 0x01 << 10); //SPI0_CS
//s3c_gpio_cfgpin(S3C64XX_GPC(3), S3C64XX_GPC3_SPI_nCS0);
s3c_gpio_cfgpin(S3C64XX_GPF(6), S3C64XX_GPF6_EINT_G4_6); //CAN_INT GPIO-BANK-f.h camera
s3c_cs_config(S3C64XX_GPC(5), S3C64XX_GPC_OUTPUT(5),CS_LOW); //CAN_MODE
s3c_cs_set(S3C64XX_GPC(5),CS_LOW);
// printk("%s:%d\n",__FUNCTION__,__LINE__);
}
static struct mcp251x_platform_data mcp251xl_data =
{
.f_osc = 8 * 1000 * 1000,
.platform_init = s3c6410_mcp2515l_init,
};
static struct spi_board_info s3c_spi_devs[] __initdata = {
#if defined(CONFIG_SPI_CNTRLR_0)
//change time:2013-5-31 10:59:32
[color=#FF0000]#if defined(CONFIG_CAN_MCP2515)
[1] = {
.modalias = "mcp2515l",
.chip_select = 0,
.irq = IRQ_EINT_GROUP(4,6), //change time:2013-5-31 11:04:53 gpf5-cs gpf6-int
.platform_data = &mcp251xl_data,
.max_speed_hz = 100000,
.bus_num = 0,
.mode = SPI_MODE_0,//0,
}
[0] spi_board_info {[/color]
#if defined(CONFIG_CAN_MCP2515)
.modalias = "mcp2515h",
.chip_select = 0,
.irq = IRQ_EINT_GROUP(2,7),
.platform_data = &mcp251x_data,
.max_speed_hz = 100000,
.bus_num = 0,
.mode = SPI_MODE_0,//0,
#else
.modalias = "spidev", /* Test Interface */
.mode = SPI_MODE_0, /* CPOL=0, CPHA=0 */
.max_speed_hz = 100000,
/* Connected to SPI-0 as 1st Slave */
.bus_num = 0,
.irq = IRQ_SPI0,
.chip_select = 0,
#endif
},
[2] = {
.modalias = "spidev", /* Test Interface */
.mode = SPI_MODE_0, /* CPOL=0, CPHA=0 */
.max_speed_hz = 100000,
/* Connected to SPI-0 as 2nd Slave */
.bus_num = 0,
.irq = IRQ_SPI0,
.chip_select = 1,
},