kernel 3.18,mcp2515 implemented in AT91SAM9G25

来源:互联网 发布:QT与数据库实现通讯录 编辑:程序博客网 时间:2024/06/05 06:07

mcp2515的嵌入式linux的用例,网上的资料基本都是应用到比较老的内核。步骤基本无异。

本文的内容,是基于dts配置的设备支持;需要做的工作主要有两部分;dts的构建和代码的少量修改。

1.硬件连接:

外设------iso1050-----mcp2515----cpu

cpu与mcp2515之间采用spi通信方式,利用的cpu的spi0接口,片上的spi0。

2.dts的编写

1)、

      spi0: spi@f0000000 {#address-cells = <1>;#size-cells = <0>;compatible = "atmel,at91rm9200-spi";reg = <0xf0000000 0x100>;interrupts = <13 IRQ_TYPE_LEVEL_HIGH 3>;dmas = <&dma0 1 AT91_DMA_CFG_PER_ID(1)>,       <&dma0 1 AT91_DMA_CFG_PER_ID(2)>;dma-names = "tx", "rx";pinctrl-names = "default";pinctrl-0 = <&pinctrl_spi0>;clocks = <&spi0_clk>;clock-names = "spi_clk";cs-gpios = <&pioA 14 GPIO_ACTIVE_LOW>;status = "okay";};
spi这个大同小异,每个片子的配置差不多。注意的就是cs-gpios,片选的gpio。

2)、
mcp2515的dnode编写

clocks {mcp251x: mcp251x_xtal {compatible = "fixed-clock";#clock-cells = <0>;clock-frequency = <8000000>;//8Mhz,这个时钟的大小和原理图mcp2515外挂的晶振大小有关 8MHZ or 16MHZ};};ahb{ apb{spi0: spi@f0000000 {can0: can@0 {compatible = "microchip,mcp2515";reg = <0>;//cs 0clocks = <&mcp251x>;clock-names = "mcp251x_clk";spi-max-frequency = <25000000>;//25Mhzinterrupt-parent = <&pioC>;//pcinterrupts = <30 IRQ_TYPE_EDGE_FALLING>;//falling edge trigger 中断依据原理图的mcp2515的INT接到cpu的位置rst-gpios = <&pioC 5 0>;//依赖于mcp2515的reset接到cpu的哪个pinint-gpios = <&pioC 30 0>;<span style="font-family: Arial, Helvetica, sans-serif;">//依赖于mcp2515的INT接到cpu的哪个pin</span>//vdd-supply = <&reg_can>;//xceiver-supply = <&reg5v0>;};};};};

dts的修改具体可参考 microchip,mcp251x.txt


3.代码修改

mcp251x.c

struct mcp251x_priv {....    //mcp reset pin  and interrupt pin desc    struct gpio_desc *rst_gpio;    struct gpio_desc *int_gpio;....}static int mcp251x_can_probe(struct spi_device *spi){... ...    priv->rst_gpio = devm_gpiod_get_index(&spi->dev,"rst",0x00);    if (IS_ERR_OR_NULL(priv->rst_gpio))    {        priv->rst_gpio =  NULL;        //printk("get rst gpio error!!\n");    }    else    {        err = gpiod_direction_output(priv->rst_gpio, 1);        if (err) {dev_dbg(&spi->dev, "Unable to set input direction for mcp2515 INT GPIO");}        //printk("set rst gpio output!!\n");    }    priv->int_gpio = devm_gpiod_get_index(&spi->dev,"int",0x00);    if (IS_ERR_OR_NULL(priv->int_gpio))    {        priv->int_gpio =  NULL;        //printk("get int gpio error!!\n");    }    else    {        err = gpiod_direction_input(priv->int_gpio);        if (err) {dev_dbg(&spi->dev, "Unable to set input direction for mcp2515 INT GPIO");}        //printk("set int gpio input!!\n");    }... ...};








0 0
原创粉丝点击