00001 #ifndef _EN_NIOS_HH_
00002 #define _EN_NIOS_HH_
00003
00004
00005
00006
00007
00008 #include <stdlib.h>
00009
00010 typedef unsigned int UINT32;
00011 typedef unsigned short UINT16;
00012 typedef unsigned char UINT8;
00013
00014
00015 template<class T> void nios_write(UINT32 address, T val);
00016 template<class T> T nios_read(UINT32 address);
00017
00018
00019 template<class T> UINT32 nios_copyto(UINT32 address, UINT32 src, UINT32 bytes);
00020 template<class T> UINT32 nios_copyfrom(UINT32 address, UINT32 src, UINT32 bytes);
00021
00022
00023
00024 #ifndef REAL_NIOS_WRITE_FUNCTIONS
00025 template<class T> void nios_write(UINT32 address, T val)
00026 {
00027 T *addr = (T *)address;
00028 *addr = val;
00029 }
00030
00031
00032 template<class T> T nios_read(UINT32 address)
00033 {
00034 T *addr = (T *)address;
00035 T val = *addr;
00036 return val;
00037 }
00038
00039 template<class T> UINT32 nios_copyto(UINT32 dest, UINT32 src, UINT32 sz)
00040 {
00041 memcpy((UINT32 *)dest, (UINT32 *)src, sz);
00042 return sz;
00043 }
00044
00045 template<class T> UINT32 nios_copyfrom(UINT32 dest, UINT32 src, UINT32 sz)
00046 {
00047 memcpy((UINT32 *)dest, (UINT32 *)src, sz);
00048 return sz;
00049 }
00050 #endif
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 #ifndef LOCAL_NIOS
00066
00067 template<class T> class nios_int {
00068 public:
00069 T ptr;
00070
00071 T operator=(T x)
00072 {
00073 nios_write<T>(ptr, x);
00074 return x;
00075 }
00076
00077 operator T() const
00078 {
00079 T x = nios_read<T>(ptr);
00080 return x;
00081 }
00082
00083 };
00084
00085 template<class T> class nios_device {
00086 public:
00087 UINT32 base_addr;
00088 UINT32 size;
00089 nios_int<T> *shadow;
00090
00091 nios_device<T>(UINT32 base, UINT32 size) {
00092
00093 base_addr = base;
00094 shadow = NULL;
00095 shadow = (nios_int<T> *)malloc(size*sizeof(nios_int<T>));
00096
00097 for(int i=0;i<size;i++) {
00098 shadow[i].ptr = base + sizeof(T) * i;
00099 }
00100 };
00101
00102 ~nios_device<T>() {
00103 if(shadow) free(shadow);
00104 }
00105
00106 nios_int<T> &operator[](int i) {
00107 return shadow[i];
00108 }
00109
00110 UINT32 copyto(nios_int<T> *dest, T *src, UINT32 bytes) {
00111 return nios_copyto<T>(dest->ptr, (UINT32)src, bytes);
00112 }
00113
00114 UINT32 copyto(UINT32 dest, T *src, UINT32 bytes) {
00115 return nios_copyto<T>(dest+base_addr,(UINT32)src,bytes);
00116 }
00117
00118 UINT32 copyfrom(T *dest, nios_int<T> *src, UINT32 bytes) {
00119 return nios_copyfrom<T>((UINT32)dest, src->ptr, bytes);
00120 }
00121
00122 UINT32 copyfrom(T * dest, UINT32 src, UINT32 bytes) {
00123 return nios_copyfrom<T>(dest, src+base_addr, bytes);
00124 }
00125 };
00126
00127
00128 #else // LOCAL_NIOS
00129
00130 template<class T> class nios_int {
00131 public:
00132 T val;
00133
00134 T operator=(T x)
00135 {
00136 char *t = (char *)this;
00137 nios_write<T>((UINT32)t, x);
00138 return x;
00139 }
00140
00141 operator T() const
00142 {
00143 T x;
00144 char *t = (char *)this;
00145 x = nios_read<T>((UINT32)t);
00146 return x;
00147 }
00148 };
00149
00150 template<class T> class nios_device {
00151 public:
00152 UINT32 base_addr;
00153 nios_int<T> *shadow;
00154
00155 nios_device(UINT32 base, UINT32) {
00156 base_addr = base;
00157 shadow = (nios_int<T> *)base;
00158 };
00159
00160
00161 nios_int<T> &operator[](int i) {
00162 return shadow[i];
00163 }
00164
00165 UINT32 copyto(nios_int<T> *dest, T *src, UINT32 bytes) {
00166 return nios_copyto<T>((UINT32)dest, (UINT32)src, bytes);
00167 }
00168
00169 UINT32 copyto(UINT32 dest, T *src, UINT32 bytes) {
00170 return nios_copyto<T>(dest+base_addr,(UINT32)src,bytes);
00171 }
00172
00173 UINT32 copyfrom(T *dest, nios_int<T> *src, UINT32 bytes) {
00174 return nios_copyfrom<T>((UINT32)dest, (UINT32)src, bytes);
00175 }
00176
00177 UINT32 copyfrom(T * dest, UINT32 src, UINT32 bytes) {
00178 return nios_copyfrom<T>(dest, src+base_addr, bytes);
00179 }
00180 };
00181
00182 #endif // over fiber
00183
00184 #endif