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 = <®_can>;//xceiver-supply = <®5v0>;};};};};
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
- kernel 3.18,mcp2515 implemented in AT91SAM9G25
- MCP2515
- A FLV Player implemented in Flex
- Chat Server with Client implemented in C#
- Gaussian BLUR implemented in cocos2d! (5
- Example of Unix commands implemented in Java
- Docker implemented in 100 lines of bash
- leetcode-happy number implemented in python
- How is map() implemented internally in Python?
- Class _NSZombie_xxxxxxx is implemented in both ?? and?
- Mips KVM Trap&Emulate implemented in Linux
- Simple Merkle Hash Tree implemented in Python
- Class PLBuildVersion is implemented in both frameworks
- Thinking in React Implemented by Reagent
- Why can templates only be implemented in the header file?
- qSort implemented in recursion and non-recuision version
- How many papers have been implemented in OpenCV?
- objc[2163]: Class JavaLaunchHelper is implemented in both XXX
- 如何在fedora下配置VPN连接
- Merge Intervals
- JavaWeb-问题-代理抛出异常
- IOS中通知中心(NSNotificationCenter)的使用总结
- 证书透明度Certificate Transparency
- kernel 3.18,mcp2515 implemented in AT91SAM9G25
- 【自定义标签开发】10-标签案例-开发转义标签
- 如何调整Linux内核启动中的驱动初始化顺序-驱动加载优先级
- Java中ArrayList类的用法(转)
- 第三方登陆步骤(友盟)
- jquery向网页输出的中文乱码的解决方法
- 多线程07:《疯狂Java讲义》学习笔记——线程组和未处理的异常
- 2把共享的属性方法移动到prototype上
- 【第七章】 对JDBC的支持 之 7.1 概述 ——跟我学spring3