ARM11+Linux系统下,CAN-mcp2515驱动问题,高手关注下,谢谢各位

smywd smywd 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
硬件:华天正科技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,
},



...全文

相关推荐

Linux中基于MCP2515的CAN总线驱动程序开发.pdf

Linux操作系统中CAN总线驱动程序开发的知识点:1. MCP2515的硬件结构:MCP2515是一种新型的独立CAN通信控制器,支持V2.0A/B技术规范,SPI串行接口实现与ARM9的通信。

结冰架构

基于i.MX 6ULL的智能车载系统:从硬件选型到Linux系统构建实战

嵌入式Linux系统是连接底层硬件与上层智能应用的核心平台,其通过模块化的内核与文件系统,为复杂设备提供了稳定、可裁剪的操作环境。在工业与物联网领域,该技术能有效管理处理器资源、外设驱动及网络协议栈,是实现设备智能化的基础。其核心价值在于平衡性能、功耗与成本,尤其适用于对可靠性要求严苛的连续运行场景。本文聚焦于智能车载这一典型应用,深入探讨如何以NXP i.MX 6ULL处理器为核心,进行硬件接口设计、嵌入式Linux系统深度裁剪,并集成CAN总线、Qt GUI等关键模块,最终构建一套高可靠的车载信息处理方

weixin_34318326

MCP2515 CAN芯片 datasheet文档说明及驱动代码

**驱动代码分析**驱动代码分为内核层驱动和应用层驱动:1. **内核层驱动**:通常基于Linux操作系统,它将MCP2515与系统的SPI子系统集成,提供设备节点供用户空间程序访问。

悠哉无忧

mcp2515驱动的实现.doc

mcp2515 驱动实现mcp2515 驱动是一种基于 SPI 协议的 CAN 总线控制器驱动程序,它可以在 Linux 操作系统下实现对 mcp2515 芯片的驱动。

会飞的鱼

can.rar_S3C2410 CAN_linux2.4 mcp2515_mcp2515.c_s3c2410

标题 "can.rar_S3C2410 CAN_linux2.4 mcp2515_mcp2515.c_s3c2410" 暗示了这是一个关于S3C2410微处理器在Linux 2.4内核下的CAN(Controller

刘良运
评论
收藏 已收藏
分享
返回顶部
smywd
驱动开发/核心开发 21,620 成员 21,709 内容