forked from xuos/xiuos
				
			
		
			
				
	
	
		
			162 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
/*
 | 
						|
 * Copyright (c) 2006-2021, RT-Thread Development Team
 | 
						|
 *
 | 
						|
 * SPDX-License-Identifier: Apache-2.0
 | 
						|
 *
 | 
						|
 * Change Logs:
 | 
						|
 * Date           Author       Notes
 | 
						|
 * 2016-09-28     armink       first version.
 | 
						|
 */
 | 
						|
 | 
						|
/**
 | 
						|
* @file test_spi_flash.c
 | 
						|
* @brief support to test spi flash function
 | 
						|
* @version 1.0 
 | 
						|
* @author AIIT XUOS Lab
 | 
						|
* @date 2021-05-17
 | 
						|
*/
 | 
						|
 | 
						|
/*************************************************
 | 
						|
File name: test_spi_flash.c
 | 
						|
Description: support spi flash function test
 | 
						|
Others: add spi flash test cmd from SFUD/blob/master/demo/stm32f2xx_rtt/RT-Thread-2.1.0/components/drivers/spi/spi_flash_sfud.c
 | 
						|
                https://github.com/armink/SFUD/
 | 
						|
History: 
 | 
						|
1. Date: 2021-05-17
 | 
						|
Author: AIIT XUOS Lab
 | 
						|
Modification: 
 | 
						|
1. support spi flash open, read and write function
 | 
						|
*************************************************/
 | 
						|
 | 
						|
#include <xizi.h>
 | 
						|
#include <device.h>
 | 
						|
#include <flash_spi.h>
 | 
						|
#include <user_api.h>
 | 
						|
 | 
						|
#define SPI_FLASH_PATH "/dev/spi1_W25Q64"
 | 
						|
#define FlashDataPrint(ch) ((unsigned int)((ch) - ' ') < 127u - ' ')
 | 
						|
 | 
						|
static int spi_flash_fd;
 | 
						|
 | 
						|
void FlashOpen(void)
 | 
						|
{
 | 
						|
    x_err_t ret = EOK;
 | 
						|
 | 
						|
    spi_flash_fd = open(SPI_FLASH_PATH, O_RDWR);
 | 
						|
    if (spi_flash_fd < 0) {
 | 
						|
        KPrintf("open spi flash fd error %d\n", spi_flash_fd);
 | 
						|
    }
 | 
						|
 | 
						|
    KPrintf("Spi Flash init succeed\n");
 | 
						|
 | 
						|
    return;
 | 
						|
}
 | 
						|
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN),
 | 
						|
                                                FlashOpen, FlashOpen,  open spi flash device);
 | 
						|
 | 
						|
void FlashRead(int argc, char *argv[])
 | 
						|
{
 | 
						|
    x_size_t i, j = 0;
 | 
						|
    uint32 addr;
 | 
						|
    uint32 size;
 | 
						|
    uint8 data[16];
 | 
						|
 | 
						|
    struct BusBlockReadParam read_param;
 | 
						|
    memset(&read_param, 0, sizeof(struct BusBlockReadParam));
 | 
						|
 | 
						|
    memset(data, 0, 16);
 | 
						|
 | 
						|
    if (3 != argc) {
 | 
						|
        KPrintf("FlashRead cmd format: FlashRead addr size.\n");
 | 
						|
        return;
 | 
						|
    } else {
 | 
						|
        addr = strtol(argv[1], NULL, 0);
 | 
						|
        size = strtol(argv[2], NULL, 0);
 | 
						|
 | 
						|
        read_param.buffer = data;
 | 
						|
        read_param.pos = addr;
 | 
						|
        read_param.size = size;
 | 
						|
 | 
						|
        if (read_param.buffer) {
 | 
						|
            read(spi_flash_fd, &read_param, size);
 | 
						|
            if (size == read_param.read_length) {
 | 
						|
                KPrintf("Read the %s flash data success. Start from 0x%08X, size is %ld. The data is:\n",
 | 
						|
                        SPI_FLASH_PATH, addr, size);
 | 
						|
                KPrintf("Offset (h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\n");
 | 
						|
                for (i = 0; i < size; i += 16) {
 | 
						|
                    KPrintf("[%08X] ", addr + i);
 | 
						|
                    /* dump hex */
 | 
						|
                    for (j = 0; j < 16; j++) {
 | 
						|
                        if (i + j < size) {
 | 
						|
                            KPrintf("%02X ", data[i + j]);
 | 
						|
                        } else {
 | 
						|
                            KPrintf("   ");
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                    /* dump char for hex */
 | 
						|
                    for (j = 0; j < 16; j++) {
 | 
						|
                        if (i + j < size) {
 | 
						|
                            KPrintf("%c", FlashDataPrint(data[i + j]) ? data[i + j] : '.');
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                    KPrintf("\n");
 | 
						|
                }
 | 
						|
                KPrintf("\n");
 | 
						|
            }
 | 
						|
        } else {
 | 
						|
            KPrintf("SpiFlashRead alloc read buffer failed!\n");
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    return;
 | 
						|
}
 | 
						|
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN),
 | 
						|
                                                FlashRead, FlashRead,  read data from spi flash device);
 | 
						|
 | 
						|
void FlashWrite(int argc, char *argv[])
 | 
						|
{
 | 
						|
    x_err_t ret = EOK;
 | 
						|
    x_size_t i, j = 0;
 | 
						|
    uint32 addr;
 | 
						|
    uint32 size;
 | 
						|
    uint8 data[16];
 | 
						|
 | 
						|
    struct BusBlockWriteParam write_param;
 | 
						|
    memset(&write_param, 0, sizeof(struct BusBlockWriteParam));
 | 
						|
 | 
						|
    memset(data, 0, 16);
 | 
						|
 | 
						|
    if (argc < 3) {
 | 
						|
        KPrintf("FlashWrite cmd format: FlashWrite addr data.\n");
 | 
						|
        return;
 | 
						|
    } else {
 | 
						|
        addr = strtol(argv[1], NULL, 0);
 | 
						|
        size = argc - 2;
 | 
						|
 | 
						|
        write_param.buffer = data;
 | 
						|
        write_param.pos = addr;
 | 
						|
        write_param.size = size;
 | 
						|
 | 
						|
        if (data) {
 | 
						|
            for (i = 0; i < size; i++) {
 | 
						|
                data[i] = strtol(argv[2 + i], NULL, 0);
 | 
						|
            }
 | 
						|
 | 
						|
            ret = write(spi_flash_fd, &write_param, size);
 | 
						|
            if (EOK == ret) {
 | 
						|
                KPrintf("Write the %s flash data success. Start from 0x%08X, size is %ld.\n",
 | 
						|
                        SPI_FLASH_PATH, addr, size);
 | 
						|
                KPrintf("Write data: ");
 | 
						|
                for (i = 0; i < size; i++) {
 | 
						|
                    KPrintf("%d ", data[i]);
 | 
						|
                }
 | 
						|
                KPrintf(".\n");
 | 
						|
            }
 | 
						|
        } else {
 | 
						|
            KPrintf("SpiFlashWrite alloc write buffer failed!\n");
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN),
 | 
						|
                                                FlashWrite, FlashWrite,  write data to spi flash device);
 |