SPI总线(三):驱动实例
来源:互联网 发布:淘宝大文 编辑:程序博客网 时间:2024/06/05 09:21
平台:firefly-rk3399
详细配置参照:http://www.t-firefly.com/doc/product/info/id/92.html#SPI.E5.B7.A5.E4.BD.9C.E6.96.B9.E5.BC.8F
/* * Driver for pwm demo on Firefly board. * * Copyright (C) 2016, Zhongshan T-chip Intelligent Technology Co.,ltd. * Copyright 2006 Sam Chan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */#define DEBUG#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/err.h>#include <linux/io.h>#include <linux/of.h>#include <linux/interrupt.h>#include <linux/platform_device.h>#include <linux/spi/spi.h>#include <linux/spi/spidev.h>#define FIREFLY_SPI_READ_ID_CMD 0x9F#define FIREFLY_SPI_PRINT_ID(rbuf) \do { \if (status == 0) \dev_dbg(&spi->dev, "%s: ID = %02x %02x %02x %02x %02x\n", __FUNCTION__, \rbuf[0], rbuf[1], rbuf[2], rbuf[3], rbuf[4]); \else \dev_err(&spi->dev, "%s: read ID error\n", __FUNCTION__); \}while(0)static int firefly_spi_read_w25x_id_0(struct spi_device *spi){intstatus;char tbuf[]={FIREFLY_SPI_READ_ID_CMD};char rbuf[5];struct spi_transfert = {.tx_buf= tbuf,.len= sizeof(tbuf),};struct spi_transfer r = {.rx_buf = rbuf,.len = sizeof(rbuf),};struct spi_message m;spi_message_init(&m);spi_message_add_tail(&t, &m);spi_message_add_tail(&r, &m);status = spi_sync(spi, &m);FIREFLY_SPI_PRINT_ID(rbuf);return status;}static int firefly_spi_read_w25x_id_1(struct spi_device *spi){intstatus;char tbuf[] = {FIREFLY_SPI_READ_ID_CMD};char rbuf[5];status = spi_write_then_read(spi, tbuf, sizeof(tbuf), rbuf, sizeof(rbuf));FIREFLY_SPI_PRINT_ID(rbuf);return status;}static int firefly_spi_probe(struct spi_device *spi){ int ret = 0; struct device_node __maybe_unused *np = spi->dev.of_node; dev_dbg(&spi->dev, "Firefly SPI demo program\n");if(!spi)return -ENOMEM;dev_dbg(&spi->dev, "firefly_spi_probe: setup mode %d, %s%s%s%s%u bits/w, %u Hz max\n",(int) (spi->mode & (SPI_CPOL | SPI_CPHA)),(spi->mode & SPI_CS_HIGH) ? "cs_high, " : "",(spi->mode & SPI_LSB_FIRST) ? "lsb, " : "",(spi->mode & SPI_3WIRE) ? "3wire, " : "",(spi->mode & SPI_LOOP) ? "loopback, " : "",spi->bits_per_word, spi->max_speed_hz);firefly_spi_read_w25x_id_0(spi);firefly_spi_read_w25x_id_1(spi); return ret;}static struct of_device_id firefly_match_table[] = {{ .compatible = "firefly,rk3399-spi",},{},};static struct spi_driver firefly_spi_driver = {.driver = {.name = "firefly-spi",.owner = THIS_MODULE,.of_match_table = firefly_match_table,},.probe = firefly_spi_probe,};static int firefly_spi_init(void){return spi_register_driver(&firefly_spi_driver);}module_init(firefly_spi_init);static void firefly_spi_exit(void){spi_unregister_driver(&firefly_spi_driver);}module_exit(firefly_spi_exit);MODULE_DESCRIPTION("Firefly SPI demo driver");MODULE_ALIAS("platform:firefly-spi");MODULE_LICENSE("GPL");
此驱动只是实现简单的读取设备的ID,然后打印出来,并没有实现API接口
firefly_spi_probe中使用了两种接口操作读取W25Q128FV的ID:
firefly_spi_read_w25x_id_0接口直接使用了spi_transfer和spi_message来传送数据。
firefly_spi_read_w25x_id_1接口则使用SPI接口spi_write_then_read来读写数据。
编写spi驱动时,读写设备科参照此驱动,添加spi的API接口。
阅读全文
0 0
- SPI总线(三):驱动实例
- Linux下的SPI总线驱动(三)
- SPI总线和外设驱动(一)
- SPI总线(二):驱动分析篇
- SPI总线驱动12864
- linux SPI总线驱动
- SPI总线驱动分析
- SPI总线驱动分析
- SPI总线驱动
- Linux SPI总线和设备驱动架构之三:SPI控制器驱动
- Linux SPI总线和设备驱动架构之三:SPI控制器驱动
- Linux SPI总线和设备驱动架构之三:SPI控制器驱动
- Linux SPI总线和设备驱动架构之三:SPI控制器驱动
- Linux SPI总线和设备驱动架构之三:SPI控制器驱动
- Linux SPI总线和设备驱动架构之三:SPI控制器驱动
- Linux SPI总线和设备驱动架构之三:SPI控制器驱动
- Linux SPI总线和设备驱动架构之三:SPI控制器驱动
- Linux SPI总线和设备驱动架构之三:SPI控制器驱动
- Introduction to Software Engineering 2017年9月20日 作业1
- 解决A full JDK (not just JRE) is required
- 第八届中国跨境电商峰会暨展览即将于11月在沪召开!
- erlang实现zipwith函数
- 使用QT出现"using null output device none available"
- SPI总线(三):驱动实例
- Node.js与Go的性能对比
- tomcat启动非常慢原因深入分析
- 柯志亨老师lab3几个性能图示解释(延迟、抖动、吞吐量)
- EM算法(Expectation
- Notepad++正则表达式分组替换方法
- Python: 什么是*args和**kwargs
- wireshark插件开发
- 关于JAVA并发库编程的复习(一):synchronized锁重入