SPI 버스 (3): 구동 실례

3936 단어 linux

관련 글:
                 SPI 버스 (1): 기본 원리 편
                 SPI 버스 (2): 구동 분석 편 
플랫폼: firefly - rk 3399
자세 한 설정 참조: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 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#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
", __FUNCTION__, \ rbuf[0], rbuf[1], rbuf[2], rbuf[3], rbuf[4]); \ else \ dev_err(&spi->dev, "%s: read ID error
", __FUNCTION__); \ }while(0) static int firefly_spi_read_w25x_id_0(struct spi_device *spi) { int status; char tbuf[]={FIREFLY_SPI_READ_ID_CMD}; char rbuf[5]; struct spi_transfer t = { .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) { int status; 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
"); if(!spi) return -ENOMEM; dev_dbg(&spi->dev, "firefly_spi_probe: setup mode %d, %s%s%s%s%u bits/w, %u Hz max
", (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: fireflyspi_read_w25x_id_0 인 터 페 이 스 는 spi 를 직접 사용 합 니 다.transfer 와 spi메시지 로 데 이 터 를 전송 합 니 다.firefly_spi_read_w25x_id_1 인 터 페 이 스 는 SPI 인터페이스 spi 사용write_then_데 이 터 를 읽 고 쓰 세 요.
spi 구동 을 작성 할 때 읽 기 쓰기 장치 과 는 이 구동 을 참조 하여 spi 의 API 인 터 페 이 스 를 추가 합 니 다.
 
 

좋은 웹페이지 즐겨찾기