linux驱动开发.之spi测试工具spidev_test源码(一)

同i2c-tools工具类似,spidev_test是用来测试SPI BUS的用户态程序,其源码存在kernel目录下的tools下,具体为tools\spi\spidev_test.c。buildroot同样也提供名为spidev_test的package,可以直接进行编译,方便用户调试spi总线。

一、spidev_test
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/spi/

二、spi-tools
https://github.com/cpb-/spi-tools

spidev_test.c开源代码

// SPDX-License-Identifier: GPL-2.0-only
/*
 * SPI testing utility (using spidev driver)
 *
 * Copyright (c) 2007  MontaVista Software, Inc.
 * Copyright (c) 2007  Anton Vorontsov <avorontsov@ru.mvista.com>
 *
 * Cross-compile with cross-gcc -I/path/to/cross-kernel/include
 */

#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <getopt.h>
#include <fcntl.h>
#include <time.h>
#include <sys/ioctl.h>
#include <linux/ioctl.h>
#include <sys/stat.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>

#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))

static void pabort(const char *s)
{
   
	if (errno != 0)
		perror(s);
	else
		printf("%s\n", s);

	abort();
}

static const char *device = "/dev/spidev1.1";
static uint32_t mode;
static uint8_t bits = 8;
static char *input_file;
static char *output_file;
static uint32_t speed = 500000;
static uint16_t delay;
static int verbose;
static int transfer_size;
static int iterations;
static int interval = 5; /* interval in seconds for showing transfer rate */

static uint8_t default_tx[] = {
   
	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
	0x40, 0x00, 0x00, 0x00, 0x00, 0x95,
	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
	0xF0, 0x0D,
};

static uint8_t default_rx[ARRAY_SIZE(default_tx)] = {
   0, };
static char *input_tx;

static void hex_dump(const void *src, size_t length, size_t line_size,
		     char *prefix)
{
   
	int i = 0;
	const unsigned char *address = src;
	const unsigned char *line = address;
	unsigned char c;

	printf("%s | ", prefix);
	while (length-- > 0) {
   
		printf("%02X ", *address++);
		if (!(++i % line_size) || (length == 0 && i % line_size)) {
   
			if (length == 0) {
   
				while (i++ % line_size)
					printf("__ ");
			}
			printf(" |");
			while (line < address) {
   
				c = *line++;
				printf("%c", (c < 32 || c > 126) ? '.' : c);
			}
			printf("|\n");
			if (length > 0)
				printf("%s | ", prefix);
		}
	}
}

/*
 *  Unescape - process hexadecimal escape character
 *      converts shell input "\x23" -> 0x23
 */
static int unescape(char *_dst, char *_src, size_t len)
{
   
	int ret = 0;
	int match;
	char *src = _src;
	char *dst = _dst;
	unsigned int ch;

	while (*src) {
   
		if (*src == '\\' && *(src+1) == 'x') {
   
			match = sscanf(src + 2, "%2x", &ch);
			if (!match)
				pabort("malformed input string");

			src += 4;
			*dst++ = (unsigned char)ch;
		} else {
   
			*dst++ = *src++;
		}
		ret++;
	}
	return ret;
}

static void transfer(int fd, uint8_t const *tx, uint8_t const *rx, size_t len)
{
   
	int ret;
	int out_fd;
	struct spi_ioc_transfer tr = {
   
		.tx_buf = (unsigned long)tx,
		.rx_buf = (unsigned long)rx,
		
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: spidev_test是一款 Linux 内核模块或者用户空间程序,用于测试 SPI (Serial Peripheral Interface) 设备的正常工作情况。 SPI 是一种串行通信协议,通常用于连接芯片或传感器等外设设备与主机进行通信。spidev_test 的作用是通过 SPI 接口读取或写入数据,以确认该接口是否正常工作。 spidev_test 可以在用户空间通过命令行方式进行调用,也可以在内核空间作为一个模块加载,以便进行更加底层的测试。其中,用户空间的程序可以直接读写 /dev/spidevX.Y 设备文件,而内核模块则需要通过 SPI 设备驱动进行操作。 在使用 spidev_test 进行测试时,需要先准备一个合适的 SPI 设备和一个测试用例程序。测试用例程序通常会使用 spidev_test 提供的 read 和 write 函数进行数据的读写,并根据结果判断测试是否通过。如果测试失败,可以进一步分析错误日志或者进行硬件调试,以解决问题。 总的来说,spidev_test 是一个非常实用的工具,可用于确保 SPI 设备的正常工作。它通常被用于嵌入式系统、智能家居设备等领域,并且也可以帮助开发人员更好地理解 SPI 协议和与其相关的硬件逻辑。 ### 回答2: spidev_test是一个运行在Linux系统上的程序,用于测试SPI设备的正常工作状态。SPI是一种串行通信协议,用于在芯片之间进行高速数据传输。在嵌入式系统中经常使用SPI协议,比如控制LCD屏幕、控制器芯片等。 spidev_test通过读写SPI设备的寄存器或RAM等功能,测试SPI设备的基本操作是否正常,以及网络是否连接正确。在使用spidev_test之前,需要加载SPI驱动模块,并提前安装Linux操作系统。 Spidev_test可以对SPI协议参数进行设置,比如传输速度、传输模式、字节顺序等,以满足不同的应用场景需求。同时,spidev_test也支持通过命令行输入和读取数据,进行SPI设备读写测试。 总之,spidev_test是一个重要的测试工具,可以帮助嵌入式系统工程师进行SPI设备的快速测试和故障排查,提高工作效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值