123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- #include "rtthread.h"
- #include <stdint.h>
- #include "string.h"
- #define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ')
- static void dump_hex(const rt_uint8_t *ptr, rt_size_t buflen)
- {
- unsigned char *buf = (unsigned char*)ptr;
- int i, j;
- for (i=0; i<buflen; i+=16)
- {
- rt_kprintf("%08X: ", i);
- for (j=0; j<16; j++)
- if (i+j < buflen)
- rt_kprintf("%02X ", buf[i+j]);
- else
- rt_kprintf(" ");
- rt_kprintf(" ");
- for (j=0; j<16; j++)
- if (i+j < buflen)
- rt_kprintf("%c", __is_print(buf[i+j]) ? buf[i+j] : '.');
- rt_kprintf("\n");
- }
- }
- static void read_sd__(uint32_t addr, int length, int count)
- {
- rt_device_t device = RT_NULL;
- rt_err_t result;
- struct rt_device_blk_geometry geometry;
- rt_uint8_t * read_buffer = RT_NULL;
- device = rt_device_find("sd0");
- rt_device_init(device);
- rt_device_open(device,RT_DEVICE_FLAG_RDWR);
- rt_memset(&geometry, 0, sizeof(geometry));
- result = rt_device_control(device,
- RT_DEVICE_CTRL_BLK_GETGEOME,
- &geometry);
- rt_kprintf("device info:\r\n");
- rt_kprintf("sector size : %d byte\r\n", geometry.bytes_per_sector);
- rt_kprintf("sector count : %d \r\n", geometry.sector_count);
- rt_kprintf("block size : %d byte\r\n", geometry.block_size);
-
- rt_kprintf("\r\n");
- read_buffer = rt_malloc(geometry.bytes_per_sector*length);
- if( read_buffer == RT_NULL )
- {
- rt_kprintf("no memory for read_buffer!\r\n");
- goto __return;
- }
-
- memset(read_buffer,0x00,geometry.bytes_per_sector*length);
- // for(i = 0;i < count; i++)
- {
- result = rt_device_read(device,addr,read_buffer, length);
-
- dump_hex(read_buffer,geometry.bytes_per_sector * length);
- if(result != length)
- {
- rt_kprintf("read device :%s ", device->parent.name);
- rt_kprintf("the first sector failed.\r\n");
- goto __return;
- }
- rt_kprintf("\n");
- }
-
- __return:
- if( read_buffer != RT_NULL )
- {
- rt_free(read_buffer);
- }
- }
- static void write_sd__(uint32_t addr, int length, unsigned char data)
- {
- int i;
- rt_device_t device = RT_NULL;
- rt_err_t result;
- struct rt_device_blk_geometry geometry;
- rt_uint8_t * write_buffer = RT_NULL;
- rt_uint8_t * data_point = RT_NULL;;
-
- device = rt_device_find("sd0");
- rt_device_init(device);
- rt_device_open(device,RT_DEVICE_FLAG_RDWR);
- rt_memset(&geometry, 0, sizeof(geometry));
- result = rt_device_control(device,
- RT_DEVICE_CTRL_BLK_GETGEOME,
- &geometry);
- rt_kprintf("device info:\r\n");
- rt_kprintf("sector size : %d byte\r\n", geometry.bytes_per_sector);
- rt_kprintf("sector count : %d \r\n", geometry.sector_count);
- rt_kprintf("block size : %d byte\r\n", geometry.block_size);
- rt_kprintf("\r\n");
- write_buffer = rt_malloc(geometry.bytes_per_sector);
- if( write_buffer == RT_NULL )
- {
- rt_kprintf("no memory for write_buffer!\r\n");
- goto __return;
- }
- data_point = write_buffer;
-
- for(i=data; i<geometry.bytes_per_sector; i++)
- {
- *data_point++ = (rt_uint8_t)i;
- }
-
- for(i = addr;i < (length + addr); i++)
- {
- rt_device_write(device, addr, write_buffer,1);
- }
-
- __return:
- if( write_buffer != RT_NULL )
- {
- rt_free(write_buffer);
- }
- }
- int sdio_read(uint32_t addr, int length, int count)
- {
- read_sd__(addr, length, count);
-
- return 0;
- }
- int sdio_write(uint32_t addr, int length, unsigned char data)
- {
- write_sd__(addr, length, data);
-
- return 0;
- }
- #ifdef RT_USING_FINSH
- #include <finsh.h>
- FINSH_FUNCTION_EXPORT_ALIAS(sdio_read, sdior, sdio read test);
- FINSH_FUNCTION_EXPORT_ALIAS(sdio_write, sdiow, sdio write test);
- #endif
|