From 0fd42d7b1dcfa9480543cf6ad7e2cc0605a73052 Mon Sep 17 00:00:00 2001 From: david Date: Tue, 26 May 2009 11:35:06 +0200 Subject: [PATCH] o get lib worwq king --- tools/ffsample/linux/Makefile | 27 +++++++++------------------ tools/ffsample/linux/diskio.c | 24 ++++++++++-------------- tools/ffsample/linux/ff.h | 4 ++-- tools/ffsample/linux/fftest | Bin 40329 -> 40235 bytes tools/ffsample/linux/main.c | 2 +- 5 files changed, 22 insertions(+), 35 deletions(-) diff --git a/tools/ffsample/linux/Makefile b/tools/ffsample/linux/Makefile index bc595e8..d4f6335 100644 --- a/tools/ffsample/linux/Makefile +++ b/tools/ffsample/linux/Makefile @@ -18,12 +18,6 @@ $(bin): $(objs) clean: rm -rf $(bin) *.o - -image32: - dd if=/dev/zero of=disk00.vfat bs=1M count=64 - sudo mkfs.vfat -F 32 -v disk00.vfat - - image_parted: dd if=/dev/zero of=disk00.vfat bs=1M count=256 fdisk -H 32 -S 32 -C 500 disk00.vfat @@ -48,19 +42,11 @@ image_not_parted: sudo umount disk sudo losetup -d /dev/loop0 - -image_no_fdisk: - dd if=/dev/zero of=disk00.vfat bs=1M count=256 - sudo mkfs.vfat -I -f 2 -F 16 -v disk00.vfat - sudo mount -o loop disk00.vfat disk - sudo cp /var/log/*log disk/ - sudo umount disk - -image_no_dd: +image: rm -fv disk00.vfat - mkfs.vfat -F 32 -v -C disk00.vfat 256000 - sudo mount -o loop,check=s disk00.vfat disk - sudo cp -v /var/log/*log disk/ + mkfs.vfat -I -F 16 -v -C disk00.vfat 256000 + sudo mount -o loop disk00.vfat disk + sudo cp -v /var/log/*.log disk/ sudo umount disk mount: @@ -71,3 +57,8 @@ umount: sudo umount disk sudo losetup -d /dev/loop0 +test: + echo "fi\nfs\nfl" | ./fftest + +run: + rlwrap ./fftest diff --git a/tools/ffsample/linux/diskio.c b/tools/ffsample/linux/diskio.c index 8661aeb..40a43a4 100644 --- a/tools/ffsample/linux/diskio.c +++ b/tools/ffsample/linux/diskio.c @@ -75,11 +75,12 @@ return 1 byte #include #include #include +#include #define IMAGE_NAME "disk00.vfat" -int *image_addr; +char *image_addr; DSTATUS disk_initialize (BYTE drv) { if (drv) return STA_NOINIT; /* Supports only single drive */ @@ -98,15 +99,15 @@ DSTATUS disk_initialize (BYTE drv) { int size = lseek(fd,0,SEEK_END); lseek(fd,0,SEEK_SET); printf("Open Image (size %i)\n",size); + - //image_addr = mmap(0,fd,) image_addr = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (image_addr == MAP_FAILED) { close(fd); perror("Error mmapping the file"); exit(EXIT_FAILURE); } - + Stat &= ~STA_NOINIT; /* When device goes ready, clear STA_NOINIT */ return Stat; } @@ -137,10 +138,10 @@ DRESULT disk_read ( if (drv || !count) return RES_PARERR; if (Stat & STA_NOINIT) return RES_NOTRDY; - DWORD offset = sector * 512; + DWORD offset = sector * 512; int size = count * 512; - printf("disk_read: sector=%li count=%i addr=%p size=%i\n",sector,count,image_addr + offset,size); + printf("disk_read: sector=%li count=%i addr=%p off=%li size=%i\n",sector,count,image_addr + offset,offset,size); memcpy(buff,image_addr + offset,size); //printf("%x %x %x %x\n",buff[0],buff[1],buff[2],buff[3]); @@ -166,16 +167,11 @@ DRESULT disk_write ( if (drv || !count) return RES_PARERR; if (Stat & STA_NOINIT) return RES_NOTRDY; - /* Issue Write Setor(s) command */ - /* - write_ata(REG_COUNT, count); - write_ata(REG_SECTOR, (BYTE)sector); - write_ata(REG_CYLL, (BYTE)(sector >> 8)); - write_ata(REG_CYLH, (BYTE)(sector >> 16)); - write_ata(REG_DEV, ((BYTE)(sector >> 24) & 0x0F) | LBA); - write_ata(REG_COMMAND, CMD_WRITE); - */ + DWORD offset = sector * 512; + int size = count * 512; + printf("disk_write: sector=%li count=%i addr=%p off=%li size=%i\n",sector,count,image_addr + offset,offset,size); + memcpy(image_addr + offset,buff,size); return RES_OK; } #endif /* _READONLY */ diff --git a/tools/ffsample/linux/ff.h b/tools/ffsample/linux/ff.h index d438365..8ba05cf 100644 --- a/tools/ffsample/linux/ff.h +++ b/tools/ffsample/linux/ff.h @@ -25,7 +25,7 @@ #ifndef _FATFS #define _FATFS -#define _WORD_ACCESS 1 +#define _WORD_ACCESS 0 /* The _WORD_ACCESS option defines which access method is used to the word / data in the FAT structure. / @@ -60,7 +60,7 @@ / data transfer. This reduces memory consumption 512 bytes each file object. */ -#define _USE_STRFUNC 1 +#define _USE_STRFUNC 0 /* To enable string functions, set _USE_STRFUNC to 1 or 2. */ diff --git a/tools/ffsample/linux/fftest b/tools/ffsample/linux/fftest index 0de6398691fe35eb8ff1108db54af4431d8cb79b..8bd0121b0e6d343ec4b5a96ceab756eb86ff3009 100755 GIT binary patch delta 13186 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 ZdS>N@&9{h;Y@J(q%ho!Pje7Ei{{sti4%7eu delta 11911 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 sLJC>BaFw;-VZQ%QIVO>Pk|9~W{IP