Added a simple implementation of Coffee for STM32W108.

This commit is contained in:
salvopitru 2010-11-10 11:20:44 +00:00
parent dfbc81158b
commit 28e1445a0f
8 changed files with 804 additions and 3 deletions

View file

@ -65,11 +65,14 @@ CFLAGSNO = --endian=little --cpu=Cortex-M3 -e --diag_suppress Pa050 -D BOARD_HEA
CFLAGS += $(CFLAGSNO) $(OPTI)
AROPTS = --create
ASFLAGS = -s+ -w+ --cpu Cortex-M3 -L$(OBJECTDIR)
LDFLAGS += --redirect _Printf=_PrintfSmall --redirect _Scanf=_ScanfSmall --map=contiki-$(TARGET).map \
--config $(CONTIKI_CPU)/hal/micro/cortexm3/stm32w108/iar-cfg.icf
LDFLAGS += --redirect _Printf=_PrintfSmall --redirect _Scanf=_ScanfSmall --map=contiki-$(TARGET).map
ifndef COFFEE_FILES
LDFLAGS+= --config $(CONTIKI_CPU)/hal/micro/cortexm3/stm32w108/iar-cfg.icf
endif
OBJOPTS = --bin
else
# GCC
CC = arm-none-eabi-gcc
LD = arm-none-eabi-gcc
AS = arm-none-eabi-gcc
@ -98,6 +101,37 @@ OBJOPTS = -O binary
endif
ifdef COFFEE_FILES #if files are defined force definition of COFFEE_ADDRESS
ifndef COFFEE_ADDRESS
COFFEE_ADDRESS=0x8010000
endif
COFFEE_ADDRESS1 = $(shell echo $$(( $(COFFEE_ADDRESS) + 1 )))
CONTIKI_TARGET_SOURCEFILES += cfs-coffee.c cfs-coffee-arch.c
CFLAGS += -DCOFFEE_FILES=$(COFFEE_FILES) -DCOFFEE_ADDRESS=$(COFFEE_ADDRESS)
ifdef IAR
LDFLAGS+= --config $(CONTIKI_CPU)/hal/micro/cortexm3/stm32w108/iar-cfg-coffee.icf
else
LDFLAGS+= -Wl,--section-start=.coffeefiles=$(COFFEE_ADDRESS)
endif
#If $make invokation passed starting address use phony target to force synchronization of source to .coffeefiles section
#Warning: recompilation will not be forced if the starting address is then dropped, with dire consequences:
# -->Source that uses COFFEE_FILES and read macros for conditional compilation will be left hanging!
# -->Object modules that used .coffeefiles will overlap the .data section.
# -->$make clean is safest.
#ifeq ($(origin COFFEE_ADDRESS), command line)
# ifeq ($(COFFEE_FILES), 2) #safest to force recompilation even if eeprom address is changed, might have been switched from flash
.PHONY : coffee
coffee:
$(OBJECTDIR)/cfs-coffee-arch.o : coffee #cfs-coffee-arch uses COFFEE_FILES, COFFEE_ADDRESS
$(OBJECTDIR)/cfs-coffee.o : coffee #core routine requires recompilation
#endif
#endif
endif
FLASHER = $(CONTIKI)/tools/stm32w/stm32w_flasher/linux/stm32w_flasher
# Check if we are running under Windows

View file

@ -0,0 +1,533 @@
/*
* Copyright (c) 2009, Swedish Institute of Computer Science
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the Institute nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* This file is part of the Contiki operating system.
*
*/
/**
* \file
* Coffee architecture-dependent functionality for the STM32W108-based mb851
* platform.
* \author
* Salvatore Pitrulli <salvopitru@users.sourceforge.net>
*/
#include "cfs-coffee-arch.h"
#define DEBUG 1
#if DEBUG
#include <stdio.h>
#define PRINTF(...) printf(__VA_ARGS__)
#else
#define PRINTF(...)
#endif
#define TESTCOFFEE 1
#define DEBUG_CFS 1
#if TESTCOFFEE
#if DEBUG_CFS
#include <stdio.h>
#define PRINTF_CFS(...) printf(__VA_ARGS__)
#else
#define PRINTF_CFS(...)
#endif
#include "cfs/cfs.h"
#include "cfs/cfs-coffee.h"
#include "lib/crc16.h"
#include "lib/random.h"
#include <stdio.h>
#define FAIL(x) PRINTF("FAILED\n");error = (x); goto end;
#define FILE_SIZE 512
int
coffee_file_test(void)
{
int error;
int wfd, rfd, afd;
unsigned char buf[256], buf2[11];
int r, i, j, total_read;
unsigned offset;
cfs_remove("T1");
cfs_remove("T2");
cfs_remove("T3");
cfs_remove("T4");
cfs_remove("T5");
wfd = rfd = afd = -1;
for(r = 0; r < sizeof(buf); r++) {
buf[r] = r;
}
PRINTF("TEST 1\n");
/* Test 1: Open for writing. */
wfd = cfs_open("T1", CFS_WRITE);
if(wfd < 0) {
FAIL(-1);
}
PRINTF("PASSED\n");
PRINTF("TEST ");
PRINTF("2\n");
/* Test 2: Write buffer. */
r = cfs_write(wfd, buf, sizeof(buf));
if(r < 0) {
FAIL(-2);
} else if(r < sizeof(buf)) {
FAIL(-3);
}
PRINTF("PASSED\n");
PRINTF("TEST ");
PRINTF("3\n");
/* Test 3: Deny reading. */
r = cfs_read(wfd, buf, sizeof(buf));
if(r >= 0) {
FAIL(-4);
}
PRINTF("PASSED\n");
PRINTF("TEST ");
PRINTF("4\n");
/* Test 4: Open for reading. */
rfd = cfs_open("T1", CFS_READ);
if(rfd < 0) {
FAIL(-5);
}
PRINTF("PASSED\n");
PRINTF("TEST ");
PRINTF("5\n");
/* Test 5: Write to read-only file. */
r = cfs_write(rfd, buf, sizeof(buf));
if(r >= 0) {
FAIL(-6);
}
PRINTF("PASSED\n");
PRINTF("TEST ");
PRINTF("7\n");
/* Test 7: Read the buffer written in Test 2. */
memset(buf, 0, sizeof(buf));
r = cfs_read(rfd, buf, sizeof(buf));
if(r < 0) {
FAIL(-8);
} else if(r < sizeof(buf)) {
PRINTF_CFS("r=%d\n", r);
FAIL(-9);
}
PRINTF("PASSED\n");
PRINTF("TEST ");
PRINTF("8\n");
/* Test 8: Verify that the buffer is correct. */
for(r = 0; r < sizeof(buf); r++) {
if(buf[r] != r) {
PRINTF_CFS("r=%d. buf[r]=%d\n", r, buf[r]);
FAIL(-10);
}
}
PRINTF("PASSED\n");
PRINTF("TEST ");
PRINTF("9\n");
/* Test 9: Seek to beginning. */
if(cfs_seek(wfd, 0, CFS_SEEK_SET) != 0) {
FAIL(-11);
}
PRINTF("PASSED\n");
PRINTF("TEST ");
PRINTF("10\n");
/* Test 10: Write to the log. */
r = cfs_write(wfd, buf, sizeof(buf));
if(r < 0) {
FAIL(-12);
} else if(r < sizeof(buf)) {
FAIL(-13);
}
PRINTF("PASSED\n");
PRINTF("TEST ");
PRINTF("11\n");
/* Test 11: Read the data from the log. */
cfs_seek(rfd, 0, CFS_SEEK_SET);
memset(buf, 0, sizeof(buf));
r = cfs_read(rfd, buf, sizeof(buf));
if(r < 0) {
FAIL(-14);
} else if(r < sizeof(buf)) {
FAIL(-15);
}
PRINTF("PASSED\n");
PRINTF("TEST ");
PRINTF("12\n");
/* Test 12: Verify that the data is correct. */
for(r = 0; r < sizeof(buf); r++) {
if(buf[r] != r) {
FAIL(-16);
}
}
PRINTF("PASSED\n");
PRINTF("TEST ");
PRINTF("13\n");
/* Test 13: Write a reversed buffer to the file. */
for(r = 0; r < sizeof(buf); r++) {
buf[r] = sizeof(buf) - r - 1;
}
if(cfs_seek(wfd, 0, CFS_SEEK_SET) != 0) {
FAIL(-17);
}
r = cfs_write(wfd, buf, sizeof(buf));
if(r < 0) {
FAIL(-18);
} else if(r < sizeof(buf)) {
FAIL(-19);
}
if(cfs_seek(rfd, 0, CFS_SEEK_SET) != 0) {
FAIL(-20);
}
PRINTF("PASSED\n");
PRINTF("TEST ");
PRINTF("14\n");
/* Test 14: Read the reversed buffer. */
cfs_seek(rfd, 0, CFS_SEEK_SET);
memset(buf, 0, sizeof(buf));
r = cfs_read(rfd, buf, sizeof(buf));
if(r < 0) {
FAIL(-21);
} else if(r < sizeof(buf)) {
PRINTF_CFS("r = %d\n", r);
FAIL(-22);
}
PRINTF("PASSED\n");
PRINTF("TEST ");
PRINTF("15\n");
/* Test 15: Verify that the data is correct. */
for(r = 0; r < sizeof(buf); r++) {
if(buf[r] != sizeof(buf) - r - 1) {
FAIL(-23);
}
}
cfs_close(rfd);
cfs_close(wfd);
if(cfs_coffee_reserve("T2", FILE_SIZE) < 0) {
FAIL(-24);
}
PRINTF("PASSED\n");
PRINTF("TEST ");
PRINTF("16\n");
/* Test 16: Test multiple writes at random offset. */
for(r = 0; r < 100; r++) {
wfd = cfs_open("T2", CFS_WRITE | CFS_READ);
if(wfd < 0) {
FAIL(-25);
}
offset = random_rand() % FILE_SIZE;
for(r = 0; r < sizeof(buf); r++) {
buf[r] = r;
}
if(cfs_seek(wfd, offset, CFS_SEEK_SET) != offset) {
FAIL(-26);
}
if(cfs_write(wfd, buf, sizeof(buf)) != sizeof(buf)) {
FAIL(-27);
}
if(cfs_seek(wfd, offset, CFS_SEEK_SET) != offset) {
FAIL(-28);
}
memset(buf, 0, sizeof(buf));
if(cfs_read(wfd, buf, sizeof(buf)) != sizeof(buf)) {
FAIL(-29);
}
for(i = 0; i < sizeof(buf); i++) {
if(buf[i] != i) {
PRINTF_CFS("buf[%d] != %d\n", i, buf[i]);
FAIL(-30);
}
}
}
PRINTF("PASSED\n");
PRINTF("TEST ");
PRINTF("17\n");
/* Test 17: Append data to the same file many times. */
#define APPEND_BYTES 3000
#define BULK_SIZE 10
for (i = 0; i < APPEND_BYTES; i += BULK_SIZE) {
afd = cfs_open("T3", CFS_WRITE | CFS_APPEND);
if (afd < 0) {
FAIL(-31);
}
for (j = 0; j < BULK_SIZE; j++) {
buf[j] = 1 + ((i + j) & 0x7f);
}
if ((r = cfs_write(afd, buf, BULK_SIZE)) != BULK_SIZE) {
PRINTF_CFS("Count:%d, r=%d\n", i, r);
FAIL(-32);
}
cfs_close(afd);
}
PRINTF("PASSED\n");
PRINTF("TEST ");
PRINTF("18\n");
/* Test 18: Read back the data written in Test 17 and verify that it
is correct. */
afd = cfs_open("T3", CFS_READ);
if(afd < 0) {
FAIL(-33);
}
total_read = 0;
while((r = cfs_read(afd, buf2, sizeof(buf2))) > 0) {
for(j = 0; j < r; j++) {
if(buf2[j] != 1 + ((total_read + j) & 0x7f)) {
FAIL(-34);
}
}
total_read += r;
}
if(r < 0) {
PRINTF_CFS("FAIL:-35 r=%d\n",r);
FAIL(-35);
}
if(total_read != APPEND_BYTES) {
PRINTF_CFS("FAIL:-35 total_read=%d\n",total_read);
FAIL(-35);
}
cfs_close(afd);
PRINTF("PASSED\n");
PRINTF("TEST ");
PRINTF("19\n");
/***************T4********************/
/* file T4 and T5 writing forces to use garbage collector in greedy mode
* this test is designed for 10kb of file system
* */
#define APPEND_BYTES_1 2000
#define BULK_SIZE_1 10
for (i = 0; i < APPEND_BYTES_1; i += BULK_SIZE_1) {
afd = cfs_open("T4", CFS_WRITE | CFS_APPEND);
if (afd < 0) {
FAIL(-36);
}
for (j = 0; j < BULK_SIZE_1; j++) {
buf[j] = 1 + ((i + j) & 0x7f);
}
if ((r = cfs_write(afd, buf, BULK_SIZE_1)) != BULK_SIZE_1) {
PRINTF_CFS("Count:%d, r=%d\n", i, r);
FAIL(-37);
}
cfs_close(afd);
}
afd = cfs_open("T4", CFS_READ);
if(afd < 0) {
FAIL(-38);
}
total_read = 0;
while((r = cfs_read(afd, buf2, sizeof(buf2))) > 0) {
for(j = 0; j < r; j++) {
if(buf2[j] != 1 + ((total_read + j) & 0x7f)) {
PRINTF_CFS("FAIL:-39, total_read=%d r=%d\n",total_read,r);
FAIL(-39);
}
}
total_read += r;
}
if(r < 0) {
PRINTF_CFS("FAIL:-40 r=%d\n",r);
FAIL(-40);
}
if(total_read != APPEND_BYTES_1) {
PRINTF_CFS("FAIL:-41 total_read=%d\n",total_read);
FAIL(-41);
}
cfs_close(afd);
/***************T5********************/
PRINTF("PASSED\n");
PRINTF("TEST ");
PRINTF("20\n");
#define APPEND_BYTES_2 1000
#define BULK_SIZE_2 10
for (i = 0; i < APPEND_BYTES_2; i += BULK_SIZE_2) {
afd = cfs_open("T5", CFS_WRITE | CFS_APPEND);
if (afd < 0) {
FAIL(-42);
}
for (j = 0; j < BULK_SIZE_2; j++) {
buf[j] = 1 + ((i + j) & 0x7f);
}
if ((r = cfs_write(afd, buf, BULK_SIZE_2)) != BULK_SIZE_2) {
PRINTF_CFS("Count:%d, r=%d\n", i, r);
FAIL(-43);
}
cfs_close(afd);
}
afd = cfs_open("T5", CFS_READ);
if(afd < 0) {
FAIL(-44);
}
total_read = 0;
while((r = cfs_read(afd, buf2, sizeof(buf2))) > 0) {
for(j = 0; j < r; j++) {
if(buf2[j] != 1 + ((total_read + j) & 0x7f)) {
PRINTF_CFS("FAIL:-45, total_read=%d r=%d\n",total_read,r);
FAIL(-45);
}
}
total_read += r;
}
if(r < 0) {
PRINTF_CFS("FAIL:-46 r=%d\n",r);
FAIL(-46);
}
if(total_read != APPEND_BYTES_2) {
PRINTF_CFS("FAIL:-47 total_read=%d\n",total_read);
FAIL(-47);
}
cfs_close(afd);
PRINTF("PASSED\n");
error = 0;
end:
cfs_close(wfd); cfs_close(rfd); cfs_close(afd);
return error;
}
#endif /* TESTCOFFEE */
void stm32w_flash_read(int32u address, void * data, int32u length)
{
int8u * pdata = (int8u *)address;
ENERGEST_ON(ENERGEST_TYPE_FLASH_READ);
memcpy(data, pdata, length);
ENERGEST_OFF(ENERGEST_TYPE_FLASH_READ);
}
void stm32w_flash_erase(int8u sector)
{
//halInternalFlashErase(MFB_PAGE_ERASE, COFFEE_START + (sector) * COFFEE_SECTOR_SIZE);
int16u data = 0;
int32u addr = COFFEE_START + (sector) * COFFEE_SECTOR_SIZE;
int32u end = addr + COFFEE_SECTOR_SIZE;
/* This prevents from accidental write to CIB. */
if (!(addr >= MFB_BOTTOM && end <= MFB_TOP + 1)) {
return;
}
for(; addr < end; addr += 2){
halInternalFlashWrite(addr, &data, 1);
}
}
// Allocates a buffer of FLASH_PAGE_SIZE bytes statically (rather than on the stack).
#ifndef STATIC_FLASH_BUFFER
#define STATIC_FLASH_BUFFER 1
#endif
void stm32w_flash_write(int32u address, const void * data, int32u length)
{
const int32u end = address + length;
int32u i;
int32u next_page, curr_page;
int16u offset;
#if STATIC_FLASH_BUFFER
static int8u buf[FLASH_PAGE_SIZE];
#else
int8u buf[FLASH_PAGE_SIZE];
#endif
for(i = address; i < end;) {
next_page = (i | (FLASH_PAGE_SIZE-1)) + 1;
curr_page = i & ~(FLASH_PAGE_SIZE-1);
offset = i-curr_page;
if(next_page > end) {
next_page = end;
}
// Read a page from flash and put it into a mirror buffer.
stm32w_flash_read(curr_page, buf, FLASH_PAGE_SIZE);
// Update flash mirror data with new data.
memcpy(buf + offset, data, next_page - i);
// Erase flash page.
ENERGEST_ON(ENERGEST_TYPE_FLASH_WRITE);
halInternalFlashErase(MFB_PAGE_ERASE, i);
// Write modified data form mirror buffer into the flash.
halInternalFlashWrite(curr_page, (int16u *)buf, FLASH_PAGE_SIZE/2);
ENERGEST_OFF(ENERGEST_TYPE_FLASH_WRITE);
data = (u8_t *)data + next_page - i;
i = next_page;
}
}

View file

@ -0,0 +1,118 @@
/*
* Copyright (c) 2010, STMicroelectronics.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the Institute nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* This file is part of the Contiki operating system.
*
*/
/**
* \file
* Coffee architecture-dependent header for the STM32W108-based mb851
* platform.
* STM32W108 has 128KB of program flash.
* \author
* Salvatore Pitrulli <salvopitru@users.sourceforge.net>
*/
#ifndef CFS_COFFEE_ARCH_H
#define CFS_COFFEE_ARCH_H
#include "contiki-conf.h"
#include "hal/error.h"
#include "hal/micro/cortexm3/flash.h"
/* STM32W108 has 128 pages of 1024 bytes each = 128KB
* The smallest erasable unit is one page and the smallest writable
* unit is an aligned 16-bit half-word.
*/
/* Byte page size, starting address on page boundary, and size of the file system */
#define FLASH_START 0x8000000
/* Minimum erasable unit. */
#define FLASH_PAGE_SIZE 1024
/* Last 3 pages reserved for NVM. */
#define FLASH_PAGES 125
/* Minimum reservation unit for Coffee. It can be changed by the user. */
#define COFFEE_PAGE_SIZE (FLASH_PAGE_SIZE/4)
/* If using IAR, COFFEE_ADDRESS reflects the static value in the linker script
iar-cfg-coffee.icf, so it can't be passed as a parameter for Make.*/
#ifdef __ICCARM__
#define COFFEE_ADDRESS 0x8010000
#endif
#define COFFEE_PAGES ((FLASH_PAGES*FLASH_PAGE_SIZE-(COFFEE_ADDRESS-FLASH_START))/COFFEE_PAGE_SIZE)
#define COFFEE_START (COFFEE_ADDRESS & ~(COFFEE_PAGE_SIZE-1))
#define COFFEE_SIZE (COFFEE_PAGES*COFFEE_PAGE_SIZE)
/* These must agree with the parameters passed to makefsdata */
#define COFFEE_SECTOR_SIZE FLASH_PAGE_SIZE
#define COFFEE_NAME_LENGTH 20
///* These are used internally by the AVR flash read routines */
///* Word reads are faster but take 130 bytes more PROGMEM */
//#define FLASH_WORD_READS 1
///* 1=Slower reads, but no page writes after erase and 18 bytes less PROGMEM. Best for dynamic file system */
//#define FLASH_COMPLEMENT_DATA 0
/* These are used internally by the coffee file system */
/* Micro logs are not needed for single page sectors */
#define COFFEE_MAX_OPEN_FILES 4
#define COFFEE_FD_SET_SIZE 8
#define COFFEE_DYN_SIZE (COFFEE_PAGE_SIZE*1)
#define COFFEE_MICRO_LOGS 0
#define COFFEE_LOG_TABLE_LIMIT 16 // It doesnt' matter as
#define COFFEE_LOG_SIZE 128 // COFFEE_MICRO_LOGS is 0.
#if COFFEE_PAGES <= 0x100
#define coffee_page_t uint8_t
#elif COFFEE_PAGES <= 0x10000
#endif
#define COFFEE_WRITE(buf, size, offset) \
stm32w_flash_write(COFFEE_START + offset, buf, size)
#define COFFEE_READ(buf, size, offset) \
stm32w_flash_read(COFFEE_START + offset, buf, size)
#define COFFEE_ERASE(sector) \
stm32w_flash_erase(sector)
void stm32w_flash_read(int32u address, void * data, int32u length);
void stm32w_flash_write(int32u address, const void * data, int32u length);
void stm32w_flash_erase(int8u sector);
int coffee_file_test(void);
#endif /* !COFFEE_ARCH_H */

View file

@ -0,0 +1,37 @@
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
define symbol __ICFEDIT_region_ROM_end__ = 0x0800FFFF;
define symbol __ICFEDIT_region_CFS_start__ = 0x08010000; /* Reserved for contiki flash file system. COFFEE_ADDRESS must be changed also in cfs-coffee-arch.h */
define symbol __ICFEDIT_region_CFS_end__ = 0x0801F3FF;
define symbol __ICFEDIT_region_NVM_start__ = 0x0801F400;
define symbol __ICFEDIT_region_NVM_end__ = 0x0801FFFF;
define symbol __ICFEDIT_region_FIB_start__ = 0x08040000;
define symbol __ICFEDIT_region_FIB_end__ = 0x080407FF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__ = 0x20001FFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x500;
define memory mem with size = 4G;
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
define region CFS_region = mem:[from __ICFEDIT_region_CFS_start__ to __ICFEDIT_region_CFS_end__];
define region NVM_region = mem:[from __ICFEDIT_region_NVM_start__ to __ICFEDIT_region_NVM_end__];
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
initialize by copy { readwrite };
do not initialize { section .noinit,
section FAT,
section NVM };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place at address mem:__ICFEDIT_region_FIB_start__ { section FAT };
place in ROM_region { readonly };
place in CFS_region { section .coffeefiles };
place in NVM_region { section NVM };
place in RAM_region { readwrite,
block CSTACK };

View file

@ -0,0 +1,7 @@
CONTIKI_PROJECT = coffee-test
all: $(CONTIKI_PROJECT)
COFFEE_FILES=1
CONTIKI = ../../..
include $(CONTIKI)/Makefile.include

View file

@ -0,0 +1 @@
TARGET = mb851

View file

@ -0,0 +1,66 @@
/*
* Copyright (c) 2010, STMicroelectronics.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the Institute nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* This file is part of the Contiki operating system.
*
* $Id: coffee-test.c,v 1.1 2010/11/10 11:20:44 salvopitru Exp $
*/
/**
* \file
* An application for coffee testing.
* \author
* Salvatore Pitrulli <salvopitru@users.sourceforge.net>
*/
#include "contiki.h"
#include "cfs-coffee-arch.h"
#include "cfs-coffee.h"
#include <stdio.h>
/*---------------------------------------------------------------------------*/
PROCESS(coffee_test_process, "Coffee test process");
AUTOSTART_PROCESSES(&coffee_test_process);
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(coffee_test_process, ev, data)
{
PROCESS_BEGIN();
printf("Testing coffee...\n");
cfs_coffee_format();
int ret = coffee_file_test();
printf("Test returned %d.\n",ret);
PROCESS_END();
}
/*---------------------------------------------------------------------------*/

View file

@ -28,7 +28,7 @@
*
* This file is part of the Contiki operating system.
*
* $Id: mb851-shell.c,v 1.1 2010/10/25 13:34:29 salvopitru Exp $
* $Id: mb851-shell.c,v 1.2 2010/11/10 11:20:44 salvopitru Exp $
*/
/**
@ -60,6 +60,11 @@ PROCESS_THREAD(mb851_shell_process, ev, data)
shell_time_init();
shell_sensors_init();
#if COFFEE_FILES
shell_coffee_init();
shell_file_init();
#endif
PROCESS_END();
}
/*---------------------------------------------------------------------------*/