semihost server example program

Dependencies:   SWD mbed USBLocalFileSystem BaseDAP USBDAP

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Semihost.h Source File

Semihost.h

00001 // Semihost.h 2014/5/3
00002 #pragma once
00003 #include "Target2.h"
00004 #include "USBLocalFileSystem.h"
00005 #include "mydebug.h"
00006 
00007 /** Semihosting
00008  */
00009 class Semihost {
00010 public:
00011     Semihost(Target2* target, Serial* usbpc, USBLocalFileSystem* usb);
00012     void mount(const char* dirpath);
00013     int poll();
00014     enum Reason {
00015         SYS_NONE = 0,
00016         SYS_EXIT = 0x18,
00017     };
00018     int readable();
00019     int getc();
00020 
00021 private:
00022     int exec(uint32_t reason, uint32_t arg);
00023     
00024     int sys_open(uint32_t arg);   // 0x01
00025     int sys_close(uint32_t arg);  // 0x02
00026     int sys_writec(uint32_t arg); // 0x03
00027     int sys_write0(uint32_t arg); // 0x04
00028     int sys_write(uint32_t arg);  // 0x05
00029     int sys_read(uint32_t arg);   // 0x06
00030     int sys_readc(uint32_t arg);  // 0x07
00031     int sys_istty(uint32_t arg);  // 0x09
00032     int sys_fseek(uint32_t arg);  // 0x0a
00033     int sys_ensure(uint32_t arg); // 0x0b
00034     int sys_flen(uint32_t arg);   // 0x0c
00035     int sys_remove(uint32_t arg); // 0x0e
00036     int sys_rename(uint32_t arg); // 0x0f
00037     int sys_exit(uint32_t arg);   // 0x18
00038 
00039     int usr_xffind(uint32_t arg);      // 0x100
00040     int usr_uid(uint32_t arg);         // 0x101
00041     int usr_reset(uint32_t arg);       // 0x102
00042     int usr_vbus(uint32_t arg);        // 0x103
00043     int usr_powerdown(uint32_t arg);   // 0x104
00044     int usr_disabledebug(uint32_t arg);// 0x105
00045     
00046     void _build_name(char* buf, int size, uint32_t arg1, uint32_t arg2);
00047 
00048     template<typename T>
00049     void wr(uint32_t addr, T data) {
00050         TEST_ASSERT(addr <= 0x10001fff);
00051         for(int i = 0; i < sizeof(T); i++) {
00052             _target->writeMemory8(addr+i, data);
00053             data >>= 8;
00054         }
00055     }
00056 
00057     template<typename T>
00058     T rd(uint32_t addr) {
00059         TEST_ASSERT(addr <= 0x10001fff);
00060         T data = 0;
00061         for(int i = sizeof(T)-1; i >= 0; i--) {
00062             data <<= 8;
00063             data |= _target->readMemory8(addr+i);
00064         }
00065         return data;
00066     }
00067  
00068 protected:
00069     Target2* _target;
00070     Serial* _pc;
00071     USBLocalFileSystem* _usb;
00072     char* _dirpath;
00073     int _writec_buf;
00074 };