嵌入式linux FM25L256的驱动(应用层)程序

 上面是基于linux2.6.30实现的spi驱动的应用层测试程序:

#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>

#define SPI_DEVICE "/dev/spidev1.0"

//fm25L256 cmd
#define FM_OPT_WREN     0x06
#define FM_OPT_WRDI     0x04
#define FM_OPT_RDSR 0x05
#define FM_OPT_WRSR 0x01
#define FM_OPT_ERAD 0x03
#define FM_OPT_WRIT 0x02

//fm25l256 para
#define FM_ADDR_MAX 0x7fff
#define FM_MODE SPI_MODE_0
#define FM_BITS            8
#define FM_FREQ_MAX 50000000
#define FM_OPT_ADDR 0x0

static uint8_t gMode = FM_MODE;
static uint8_t gBits = FM_BITS;
static uint32_t gSpeed = FM_FREQ_MAX;
static uint16_t gOptAddr = FM_OPT_ADDR;
uint8_t gLsb;
static int spi_write_read(int fd, const uint8_t *wbuf, int wlen, uint8_t *rbuf, int rlen){
    int ret = 0;
    struct spi_ioc_transfer tr[2] = {
        {
            .tx_buf = (unsigned long)wbuf,
            .rx_buf = 0,
            .len = wlen,
            .speed_hz = 5000000,
        },
        {
            .tx_buf = 0,
            .rx_buf = (unsigned long)rbuf,
            .len = rlen,
            .speed_hz = 5000000,
        },
    };

    ret = ioctl(fd, SPI_IOC_MESSAGE(2), tr);
    return ret;
}

static int spi_write_only(int fd, const uint8_t *wbuf, int wlen, uint8_t *rbuf, int rlen){
    int ret = 0;
    struct spi_ioc_transfer tr[1] = {
        {
            .tx_buf = (unsigned long)wbuf,
            .rx_buf = 0,
            .len = wlen,
            .speed_hz = 5000000,
        },
    };

    ret = ioctl(fd, SPI_IOC_MESSAGE(1), tr);
    return ret;
}
int main(int argc, char *argv[]){
    int fd;
    int index;
    int optSize;
    int ret;
    int i;
    int tmpSize;
    uint8_t rdBuf[128];
    uint8_t wrBuf[128];
    uint8_t cmd;
    
    if(argc != 2){
        printf("argc error.\n");
        return -1;
    }

    tmpSize = atoi(argv[1]);

    fd = open(SPI_DEVICE, O_RDWR);
    if(fd < 0){
        printf("open spi file error.\n");
        return -1;
    }
    
    //mode
    ret = ioctl(fd, SPI_IOC_WR_MODE, &gMode);
    if(ret < 0){
        printf("set wr mode error.\n");
        close(fd);
        return -1;
    }
    
    //bits
    ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &gBits);
    if(ret < 0){
        printf("set bits error.\n");
        close(fd);
        return -1;
    }
    
    //speed
    ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &gSpeed);
    if(ret < 0){
        printf("set speed error.\n");
        close(fd);
        return -1;
    }
    
    //get mode
    ret = ioctl(fd, SPI_IOC_RD_MODE, &gMode);
    printf("FM Mode: %d.\n",gMode);

    //get bits
    ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &gBits);
    printf("FM bits:%d.\n", gBits);
    
    //get speed
    ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &gSpeed);
    printf("FM speed:%d.\n", gSpeed);

    //get lsb
    ret = ioctl(fd, SPI_IOC_RD_LSB_FIRST, &gLsb);
    printf("FM lsb:%d.\n", gLsb);
    
#if 0 //---------------------- method 1 ----------------------------
    cmd = FM_OPT_WREN;
    ret = write(fd, &cmd, sizeof(cmd));
    if(ret < 0 )
        printf("write wren error.err = %d\n", ret);
    else
        printf("write wren ok.\n");

    
    index = 0;
    wrBuf[index++] = FM_OPT_WRIT;
    wrBuf[index++] = (gOptAddr>>8)&0xff;
    wrBuf[index++] = (gOptAddr>>0)&0xff;

    srand((unsigned)time(NULL)); 
    printf("write data = \n");

        
    if(tmpSize){
        for(i = 0; i < tmpSize; i++){
            rdBuf[i] = 1 + rand()%100+1;
            printf("%02x ", rdBuf[i]);
        }
    }
    else{
        tmpSize = 128;
        for(i = 0; i < tmpSize; i++){
            rdBuf[i] = 0;
            printf("%02x ", rdBuf[i]);
        }
    }
    printf("\n");

    memcpy(&wrBuf[index], rdBuf,tmpSize);
    index += tmpSize;
    optSize = index;
    //ret = spi_write_read(fd, wrBuf, optSize, 0, 0);
    ret = spi_write_only(fd, wrBuf,optSize, 0, 0);
    if(ret < 0)
        printf("write error,err = %d\n", ret);
    else
        printf("write ok.ret = %d\n", ret);
    
    memset(rdBuf, 0, sizeof(rdBuf));
    cmd = FM_OPT_ERAD;
    index = 0;
    wrBuf[index++] = cmd;
    wrBuf[index++] = (gOptAddr>>8)&0xff;
    wrBuf[index++] = (gOptAddr>>0)&0xff;
    ret = spi_write_read(fd, wrBuf, index, rdBuf, sizeof(rdBuf));
    if(ret < 0){
        printf("read error, err = %d\n", ret);
    }
    else{
        printf("read ok.ret = %d, data = \n", ret);
        for(index = 0; index < sizeof(rdBuf); index++){
            printf("%02x ", rdBuf[index]);    
        }
        printf("\n");
    }
#endif //endof method 1 ------------------------------

#if 1
//**************** method 2 *******************
    cmd = FM_OPT_WREN;
    ret = write(fd, &cmd, sizeof(cmd));
    if(ret < 0 )
        printf("write wren error.err = %d\n", ret);
    else
        printf("write wren ok.\n");


    index = 0;
    //wrBuf[index++] = FM_OPT_WREN; //fail
    wrBuf[index++] = FM_OPT_WRIT;
    wrBuf[index++] = (gOptAddr>>8)&0xff;
    wrBuf[index++] = (gOptAddr>>0)&0xff;

    srand((unsigned)time(NULL)); 
    printf("write data = \n");

        
    if(tmpSize){
        for(i = 0; i < tmpSize; i++){
            rdBuf[i] = 1 + rand()%100+1;
            printf("%02x ", rdBuf[i]);
        }
    }
    else{
        tmpSize = 128;
        for(i = 0; i < tmpSize; i++){
            rdBuf[i] = 0;
            printf("%02x ", rdBuf[i]);
        }
    }
    printf("\n");

    memcpy(&wrBuf[index], rdBuf,tmpSize);
    index += tmpSize;

    ret = write(fd, wrBuf, index);
    if(ret < 0 )
        printf("write error.err = %d\n", ret);
    else
        printf("write ok.ret = %d\n", ret);
    
    memset(rdBuf, 0, sizeof(rdBuf));
    index = 0;
    wrBuf[index++] = FM_OPT_ERAD;
    wrBuf[index++] = (gOptAddr>>8)&0xff;
    wrBuf[index++] = (gOptAddr>>0)&0xff;

    ret = spi_write_read(fd, wrBuf, index, rdBuf, sizeof(rdBuf));
    if(ret < 0 )
        printf("read error.err = %d\n", ret);
    else
        printf("read ok.ret = %d\n", ret);
#if 0 //-- fail
    ret = write(fd, wrBuf, index);
    ret = read(fd, rdBuf, 100);
    if(ret < 0 )
        printf("read error.err = %d\n", ret);
    else
        printf("read wren ok.ret = %d\n", ret);
#endif


    printf("data = \n");
    for(index = 0; index < sizeof(rdBuf); index++){
        printf("%02x ", rdBuf[index]); 
    }
    printf("\n");
#endif
 //********************************************************************************/

    close(fd);
    return 0;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值