s5p4418对mcp2515 can总线的支持

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">对于mcp2515的移植相关知识课先参考这里http://blog.csdn.net/sno_guo/article/details/17029295</span>

下面是针对s5p4418官方提供的内核为基础做的相关修改。

对于2515的驱动我们不用关心,直接使用内核自带的即可。首先我们需要对内核的配置做添加,具体如下面的图所示:

务必确保内核的配置中上面图片的选择是被打开的,免得做其他工作时造成未知的问题。

下面是修改板级目录下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结构体增加了对mcp2515的定义

2.添加mcp251x_info结构定义

3.添加void s5p4418_mcp2515_init(void)函数

这里说明一下void s5p4418_mcp2515_init(void)函数的意义,该函数是对SPI0的GPIO做了配置,在默认的情况下SPI0的GPIO不一定为SPI的功能,所以这里务必需要重新配置一下(由于开始没注意,导致了无法初始化的问题),当然这个配置工作也可以在其他的地方做。

CFG_IO_CAN_DETECT这个定义是在板级目录的include目录下cfg_main.h文件中,这里定义的是GPIOB6引脚。

做了上面的配置之后初始化就应该没有问题了。

使用ifconfig can0 up进行检测,如果不报错那么与mcp2515的通信是没有问题了。

剩下的就可以使用ip、candump等命令进行 can操作了。

希望对移植can遇到问题的朋友有所帮助。

时间: 2024-10-10 16:34:43

s5p4418对mcp2515 can总线的支持的相关文章

基于MCP2515的Linux CAN总线驱动程序设计

MCP2515简介 MCP2515是一种独立的CAN总线通信控制器,是Microchip公司首批独立CAN解决方案的升级器件,其传输能力较Microchip公司原有CAN控制器(MCP2510)高两倍,最高通信速率可达到1Mbps.MCP2515能够接收和发送标准数据帧和扩展数据帧以及远程帧,通过两个接收屏蔽寄存器和六个接收过滤寄存器滤除无关报文,从而减轻CPU负担. MCP2515主要功能参数及电气特性如下: (1)支持CAN技术规范2.0A/B, 最高传输速率达到1Mbps: (2)支持标准

关于ZYNQ-700是否支持大容量SD卡汇报

关于ZYNQ-700是否支持大容量SD卡 不支持. 下午问了客服的FAE给的答案是不清楚,我自己调研了一下为什么. 调查结果: 1. 大容量的SD卡为什么不支持? SD2.0规范中(SDHC)硬件支持的最大容量是32GB SD3.01规范中(SDXC)硬件支持的最大容量可以到2T --参考资料:http://kb-cn.sandisk.com/app/answers/detail/a_id/5302 我们使用的ZYNQ使用的是SD2.0规范,所以只能最大支持到32GB.在Xilinx公司的官网w

SOA服务总线设计

背景 基于总线的设计,借鉴了计算机内部硬件组成的设计思想(通过总线传输数据).在分布式系统中,不同子系统之间需要实现相互通信和远程调用,比较直接的方式就是“点对点”的通信方式,但是这样会暴露出一些很明显的问题:系统之间紧密耦合.配置和引用混乱.服务调用关系错综复杂.难以统一管理.异构系统之间存在不兼容等.而基于总线的设计,正是为了解决上述问题.总线则作为中枢系统,提供统一的服务入口,并实现了服务统一管理.服务路由.协议转换.数据格式转换等功能.这样能够将不同系统有效地连接起来,并大大降低了连接数

VME总线

简介 诞生于25年前的VME(VersaModule Eurocard)总线是一种通用的计算机总线,结合了Motorola公司Versa总线的电气标准和在欧洲建立的Eurocard标准的机械形状因子,是一种开放式架构.它定义了一个在紧密耦合(closely coupled)硬件构架中可进行互连数据处理.数据存储和连接外围控制器件的系统.经过多年的改造升级,VME系统已经发展的非常完善,围绕其开发的产品遍及了工业控制.军用系统.航空航天.交通运输和医疗等领域. 2特点 VME的数据传输机制是异步的

openwrt 增加RTC(MCP7940 I2C总线)驱动详解

一.硬件平台 1.1 控制器:MT7620(A9内核) 1.2 RTC芯片:MCP7940(I2C总线) 二.软件平台 2.1.开发环境:Ubuntu12.04 2.2.软件版本:openwrt 官方15.05版本SDK开发包(CHAOS CALMER 15.05版本) 三.功能说明 本文章所选择的目标芯片为MT7620,profile 选择的为"Xiaomi MiWiFi Mini ". 3.1.在openwrt 系统上,移植mcp7940的rtc芯片驱动. 3.2.在openwrt

Qsys自定义组件的开始-Avalon总线规范(中文)

学习FPGA这么长时间了,一直没有整理自己的学习内容,这回要把每一段时间的学习内容总结一下,就从自定义组件开始吧.一定要坚持下来呀!! Avalon 总线规范 参考手册   (Avalon从端口传输与流模式从端口传输部分)  //*************************************    http://www.altera.com 免责声明: 本手册原自Altera 公司发布的<Avalon Bus Specification-Reference Manual>,一切权力

AMBA总线介绍

The Advanced Microcontroller Bus Architecture (AMBA) specification defines an on- chip communications standard for designing high-performance embedded microcontrollers. 高级微控制器总线结构Advanced Microcontroller Bus Architecture(AMBA)定义了高性能嵌入式微控制器的通信标准. l  A

I3C 总线协议详细解析(第一章)

目前随着手机等移动设备包含的sensor越来越多,传统应用在sensor上的I2C/SPI接口的局限性也越来越明显,典型的缺陷如下: 1.sensor等设备的增加,对控制总线的速度和功耗提出了更加严苛的要求: 2.虽然I2C是一中2线接口,但是往往此类device需要额外增加一条中断INT信号线: 处于解决上述问题的原因,推出了I3C的接口总线和协议,下面一起来看下I3C总线的特性. 一.I3C的应用场景 从上图中我们可以看到: 1.I3C总线可以应用在各种sensor中: 2.可以使用在任何传

单片机成长之路(51基础篇) - 016 常见总线类型

1.首先看看它名字真正的含义: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS:意为IC之间总线) UART(Universal Asynchronous Receiver Transmitter:通用异步收发器) USART:通用同步异步收发器 USB:Universal Serial BUS(通用串行总线) CAN:现场总线 2.看看他们传输数据线的组成: SPI总线由三条信号线组成:串行时钟(SCLK).串行数据输出(SD