blob: 4fc5d9fd538b69d60578d0d841a2c6f5b2af389c [file] [log] [blame]
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>
#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>
#include <errno.h>
#include "ql/ql_spi.h"
#include "mbtk_log.h"
#if 0
static const char *device = "/dev/spidev1.0\0";
static uint8_t mode = 3; /* SPI通信使用全双工,设置CPOL=0,CPHA=0。 */
static uint8_t bits = 8; /* 8bits读写,MSB first。*/
static uint32_t speed = 100 * 1000;/* 设置0.5M传输速度 */
static uint16_t delay = 500;
int SPI_Transfer(const uint8_t *TxBuf, uint8_t *RxBuf, int len)
{
int ret;
int fd = g_SPI_Fd;
struct spi_ioc_transfer tr ;
memset(&tr,0x00,sizeof(tr));
tr.tx_buf = (unsigned long) TxBuf,
tr.rx_buf = (unsigned long) RxBuf,
tr.len =len,
tr.delay_usecs = delay;
tr.speed_hz=speed;
tr.bits_per_word=bits;
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret < 1)
{
printf("can't send spi message");
}
else
{
//printf("Send spi message OK %d\n",RxBuf[0]);
}
return 1;
}
/**
* 功 能:关闭SPI模块
*/
int SPI_Close(void)
{
int fd = g_SPI_Fd;
if (fd == 0) /* SPI是否已经打开*/
return 0;
close(fd);
g_SPI_Fd = 0;
return 0;
}
int SPI_Write(uint8_t *TxBuf, int len)
{
int ret;
int fd = g_SPI_Fd;
printf("fd : %d\n",fd);
ret = write(fd, TxBuf, len);
if (ret < 0)
printf("SPI Write errorn");
return ret;
}
int SPI_Open(void)
{
int fd;
int ret = 0;
printf("open spi dev:%s \r\n", device);
fd = open(device, O_RDWR);
if (fd < 0)
{
printf("can't open device \n");
return -1;
}
else
printf("SPI - Open Succeed. Start Init SPI...n\n");
/*
* spi mode
*/
ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
if (ret == -1)
printf("can't set spi mode\n");
ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);
if (ret == -1)
printf("can't get spi mode\n");
/*
* bits per word
*/
ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
if (ret == -1)
printf("can't set bits per word\n");
ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
if (ret == -1)
printf("can't get bits per word\n");
/*
* max speed hz
*/
ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
if (ret == -1)
printf("can't set max speed hz\n");
ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
if (ret == -1)
printf("can't get max speed hz\n");
g_SPI_Fd=fd;
return ret;
}
#endif
/**
* Function: Ql_SPI_Init
* Description: spi init
* Parameters: dev_name---device name
* mode---spi mode
* bits---spi per word
* speed---spi transfer clock
* Return: spi fd
**/
int Ql_SPI_Init(const char *dev_name, SPI_MODE mode, unsigned char bits, SPI_SPEED speed)
{
int fd;
int ret = 0;
LOGD("open spi dev:%s.", dev_name);
fd = open(dev_name, O_RDWR);
if (fd < 0)
{
LOGE("can't open device, errno - %d", errno);
return -1;
}
else
LOGD("SPI - Open Succeed. Start Init SPI...");
/*
* spi mode
*/
ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
if (ret == -1) {
LOGE("can't set spi mode");
goto error;
}
#if 0
ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);
if (ret == -1) {
LOGE("can't get spi mode");
goto error;
}
#endif
/*
* bits per word
*/
ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
if (ret == -1) {
LOGE("can't set bits per word");
goto error;
}
#if 0
ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
if (ret == -1) {
LOGE("can't get bits per word");
goto error;
}
#endif
/*
* max speed hz
*/
ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
if (ret == -1) {
LOGE("can't set max speed hz");
goto error;
}
#if 0
ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
if (ret == -1) {
LOGE("can't get max speed hz");
goto error;
}
#endif
return fd;
error:
if(fd > 0)
{
close(fd);
}
return -1;
}
/**
* Function: Ql_SPI_DeInit
* Description: spi deinit
* Parameters: fd---spi fd
* Return:
*/
int Ql_SPI_DeInit(int fd)
{
if (fd <= 0)
return -1;
close(fd);
return 0;
}
/**
* Function: Ql_SPI_Write_Read
* Description: spi write read function
* Parameters: fd---spi fd
* w_buf---write buffer
* r_buf---read buffer
* len---spi transfer length
* Return: 0---transfer success
* other---failed
**/
int Ql_SPI_Write_Read(int fd, unsigned char *w_buf, unsigned char *r_buf, unsigned int len)
{
int ret;
struct spi_ioc_transfer tr ;
memset(&tr,0x00,sizeof(tr));
tr.tx_buf = (unsigned long) w_buf,
tr.rx_buf = (unsigned long) r_buf,
tr.len =len,
tr.delay_usecs = 500;
//tr.speed_hz=speed;
//tr.bits_per_word=bits;
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret < 1)
{
LOGE("can't send spi message");
return -1;
}
else
{
return 0;
}
}
#if 0
int main(int argc, char *argv[])
{
char send_data[64] = {0};
char read_data[64] = {0};
char crc = 0;
int i = 0;
int j = 0;
system("echo PB6 > /sys/kernel/debug/sunxi_pinctrl/sunxi_pin");
system("echo PB6 1 > /sys/kernel/debug/sunxi_pinctrl/function");
system("echo PB6 0 > /sys/kernel/debug/sunxi_pinctrl/data");
/* spi 初始化程序 */
SPI_Open();
send_data[0] = 0x55;
send_data[1] = 0x00;
send_data[2] = 0x84;
send_data[3] = 0x00;
send_data[4] = 0x08;
send_data[5] = 0x00;
send_data[6] = 0x00;
crc = send_data[1];
for (i = 2; i < 7; i++)
{
crc ^= send_data[i];
}
crc = ~crc;
send_data[7] = crc;
printf("send data:");
for (i = 0; i < 8; i++)
{
printf("%#x, ", send_data[i]);
}
printf("\n");
/* spi 发送数据 */
SPI_Transfer(send_data,read_data,8);
printf("read data:");
for (j = 0; j < 20; j++)
{
printf("%#x, ", read_data[j]);
}
usleep(10000);
memset(read_data, 0, sizeof(read_data));
memset(send_data, 0, sizeof(send_data));
/* spi 读取数据 */
SPI_Transfer(send_data,read_data,16);
printf("read data:");
for (j = 0; j < 20; j++)
{
printf("%#x, ", read_data[j]);
}
return 0;
}
#endif