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 인 터 페 이 스 를 추가 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
용감한 바로 가기 및 우분투 응용 프로그램안녕하세요 여러분, 이 기사에서는 모든 사이트에서 pwa를 생성하고 실행기 응용 프로그램으로 추가하는 방법을 설명하고 싶습니다. 일부 웹사이트는 PWA로 설치를 허용하지 않지만 유사한 애플리케이션을 원합니다. 1. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.