SIMULINK_A7DAC  1.0
Control of A7_DAC device
tf_a7dac.cpp
Go to the documentation of this file.
1 
2 #include <stdio.h>
3 #include "utypes.h"
4 
5 #include "tf_a7dac.h"
6 
7 #include "ftd2xx.h"
8 
9 struct CMD_Item
10 {
11  int dev; //!< узел
12  int adr; //!< адрес
13  int data; //!< данные для записи
14  int *pData; //!< указатель для чтения
15  int cmd; //!< команда, 1 - запись, 0 - чтение
16 };
17 
18 //! Внутренние данные класса
20 {
21  FT_HANDLE ftHandle; //!< дескриптор устройства
22 
23  CMD_Item items[256]; //!< массив команд
24  unsigned int cmd_index; //!< номер текущей команды
25  unsigned int cmd_status; //!< состояние команды
26 
28  {
29  cmd_status=0;
30  cmd_index=0;
31  }
32 };
33 
35 {
36  td = new TF_A7Dac_TaskData();
37 }
38 
40 {
41  delete td; td=NULL;
42 }
43 
44 //! Начало работы с модулем
46 {
47 
48  printf( "Доступ к FTDI\n");
49  FT_STATUS ftStatus;
50  DWORD numDevs=-1;
51 
52  //ftStatus=FT_SetVIDPID( 0x0403, 0x6015 );
53  //ftStatus=FT_CreateDeviceInfoList( numDevs );
54 
55  ftStatus = FT_ListDevices(&numDevs,NULL,FT_LIST_NUMBER_ONLY);
56  if (ftStatus == FT_OK) {
57  // FT_ListDevices OK, number of devices connected is in numDevs
58  printf( "Число устройств=%d\n", numDevs);
59  }
60  else {
61  // FT_ListDevices failed
62  printf( "Устройство не подключено\n" );
63  return 1;
64  }
65 
66  ftStatus=FT_Open( 0, &(td->ftHandle));
67  if( FT_OK==ftStatus )
68  {
69  printf( "A7_Dac - устройство открыто\n" );
70  } else
71  {
72  printf( "A7_Dac - ошибка доступа к устройству\n");
73  return 2;
74  }
75 
76 /*
77  FT_SetBitMode( td->ftHandle, 0xF, 1 );
78 
79  DWORD bytesWritten;
80  int buf=1;
81  for( int ii=0; ii<16; ii++ )
82  {
83  buf=ii;
84  ftStatus=FT_Write( td->ftHandle, &buf, 4, &bytesWritten );
85  ftStatus=FT_Read( td->ftHandle, &buf, 4, &bytesWritten );
86  break;
87  }
88 
89  FT_SetBitMode( td->ftHandle, 0, 0 );
90 
91 
92  {
93  DWORD bytesWritten;
94  int buf=0;
95  for( int ii=0; ii<16; ii++ )
96  {
97  buf=0;
98  ftStatus=FT_Write( td->ftHandle, &buf, 4, &bytesWritten );
99  //ftStatus=FT_Read( td->ftHandle, &buf, 4, &bytesWritten );
100  }
101 
102  }
103 */
104 
105  //PldLoad( "a7dac_m2.bit" );
106 
107  int kk=0;
108 
109 //return 0;
110  for( ; ; )
111  {
112  int pldDone = GetPldDone();
113  //pldDone=0;
114  if( pldDone )
115  {
116  printf( "\nПЛИС загружена\n");
117  break;
118  } else
119  {
120  printf( "\nПЛИС не загружена\n");
121  char* fname = "a7dac_m2.bit";
122  printf( "\nЗагрузка прошивки %s ", fname );
123  int ret=PldLoad( fname );
124  if( 1==ret )
125  {
126  printf( " - Ok\n\n");
127  break;
128  }
129  else
130  {
131  printf( " - Error\n\n");
132  kk++;
133  if( kk==5 )
134  return 1;
135  }
136 
137  }
138  }
139 
140  FT_Close( td->ftHandle );
141 
142  FT_Open( 0, &(td->ftHandle));
143 
144  {
145  int data;
146  for( int ii=0; ; ii++ )
147  {
148  PkgCmdStart();
149  PkgCmdRead( 0, 0, &data );
150  PkgCmdExecute();
151 
152  if( data!=0xFFFFFFFF )
153  break;
154  }
155  }
156  //FT_ResetPort( td->ftHandle );
157  //FT_CyclePort( td->ftHandle );
158  //FT_SetUSBParameters( td->ftHandle, 2048, 2048 );
159  //FT_StopInTask( td->ftHandle );
160  //FT_RestartInTask( td->ftHandle );
161  //FT_Open( 0, &(td->ftHandle));
162 
163  return 0;
164 }
165 
166 //! Проверка наличия прошивки
168 {
169  int ret=0;
170 
171  DWORD bytesWritten;
172  unsigned char buf=1;
173 
174  FT_SetBitMode( td->ftHandle, 0, 1 );
175 
176 // buf=0xFA;
177 // FT_Write( td->ftHandle, &buf, 4, &bytesWritten );
178 // FT_Read( td->ftHandle, &buf, 4, &bytesWritten );
179 
180 
181 // buf=0x7C;
182 // FT_Write( td->ftHandle, &buf, 4, &bytesWritten );
183 // FT_Read( td->ftHandle, &buf, 4, &bytesWritten );
184 
185 // buf=0xFF;
186 // FT_Write( td->ftHandle, &buf, 4, &bytesWritten );
187 // FT_Read( td->ftHandle, &buf, 4, &bytesWritten );
188 
189  char data_in[4096];
190 // for( int ii=0; ii<512; ii++ )
191 // {
192 // FT_Read( td->ftHandle, &data_in[0], 4096, &bytesWritten );
193 // }
194 // buf=data_in[0];
195  FT_GetBitMode(td->ftHandle, &buf );
196 
197 
198  if( buf&0x10)
199  ret=1;
200 
201  FT_SetBitMode( td->ftHandle, 0, 0 );
202 
203  return ret;
204 }
205 
206 //! Загрузка прошивки ПЛИС
207 int TF_A7Dac::PldLoad( char* fname )
208 {
209  int ret=0;
210  DWORD bytesWritten;
211  unsigned char buf=1;
212 
213  FILE *fl = fopen( fname, "rb" );
214  if( NULL==fl )
215  {
216  printf( "Ошибка доступа к файлу %s\n", fname );
217  return 0;
218  }
219 
220  FT_SetBitMode( td->ftHandle, 0x80, 1 );
221 
222  {
223 
224  //FT_Read( td->ftHandle, &buf, 1, &bytesWritten );
225  FT_GetBitMode(td->ftHandle, &buf );
226 
227  // Сброс прошивки ПЛИС
228  buf=0x60;
229  FT_Write( td->ftHandle, &buf, 1, &bytesWritten );
230 
231  buf=0xE0;
232  FT_Write( td->ftHandle, &buf, 1, &bytesWritten );
233 
234  FT_SetBitMode( td->ftHandle, 0, 0 );
235  FT_SetBitMode( td->ftHandle, 0x40, 1 );
236 
237  for( int jj=0; ; jj++ )
238  {
239  //FT_Read( td->ftHandle, &buf, 4, &bytesWritten );
240  FT_GetBitMode(td->ftHandle, &buf );
241  if( 0==(buf & 0x10) )
242  break;
243  }
244  }
245 
246  char data_in[512];
247  char data_out[512*8];
248  int index;
249  for( ; ; )
250  {
251  index=fread( &data_in[0], 1, 512, fl );
252  if( 0==index )
253  break;
254 
255  for( int kk=0; kk<index; kk++ )
256  {
257  // формирование массива
258  for( int ii=0; ii<8; ii++ )
259  {
260  data_out[kk*8+ii]=0x80;
261  if( data_in[kk] & (1<<(7-ii)) )
262  {
263  data_out[kk*8+ii]|= 0xC0;
264  }
265  }
266  }
267  FT_Write( td->ftHandle, &data_out[0], index*8, &bytesWritten );
268  }
269 
270 
271 
272  for( int ii=0; ii<100; ii++ )
273  {
274  FT_Write( td->ftHandle, &data_out[0], 8, &bytesWritten );
275  }
276 
277  fclose( fl );
278 
279  FT_SetBitMode( td->ftHandle, 0, 0 );
280  FT_SetBitMode( td->ftHandle, 0, 1 );
281  ret=0;
282  for( int ii=0; ii<5000000 ; ii++ )
283  {
284 
285  // Проверка загрузки прошивки
286  //FT_Read( td->ftHandle, &data_out[0], 4096, &bytesWritten );
287  FT_GetBitMode(td->ftHandle, &buf );
288  //buf=data_out[0];
289  if( buf&0x10)
290  {
291  ret=1;
292  break;
293  }
294  }
295 
296  FT_SetBitMode( td->ftHandle, 0, 0 );
297  return ret;
298 }
299 
300 
301 //! Начало выполнения команды
303 {
304  td->cmd_status=1;
305  td->cmd_index=0;
306 }
307 
308 //! Запись в регистр
309 void TF_A7Dac::PkgCmdWrite( int dev, int adr, int data )
310 {
311  if( td->cmd_index<63 )
312  {
313  td->items[td->cmd_index].adr=adr;
314  td->items[td->cmd_index].dev=dev;
315  td->items[td->cmd_index].data=data;
316  td->items[td->cmd_index].pData=NULL;
317  td->items[td->cmd_index].cmd=1;
318  td->cmd_index++;
319  }
320 }
321 
322 //! Чтение из регистра
323 void TF_A7Dac::PkgCmdRead( int dev, int adr, int *pData )
324 {
325  if( td->cmd_index<63 )
326  {
327  td->items[td->cmd_index].adr=adr;
328  td->items[td->cmd_index].dev=dev;
329  td->items[td->cmd_index].data=0;
330  td->items[td->cmd_index].pData=pData;
331  td->items[td->cmd_index].cmd=0;
332  td->cmd_index++;
333  }
334 }
335 
336 //! Выполнение команды
338 {
339  // Формирование массива
340  int BufOut[128];
341  int BufIn[128];
342  int Buf4BitOut[256];
343  int Buf4BitIn[256];
344 
345  for( int ii=0; ii<128; ii++ )
346  {
347  BufOut[ii]=0;
348  BufIn[ii]=0;
349  }
350 
351  int cmd;
352  CMD_Item *pItem;
353  for( int ii=0; ii<td->cmd_index; ii++)
354  {
355  pItem = td->items + ii;
356  cmd = 7;
357  if( pItem->cmd )
358  cmd |=0x10; // команда записи
359  cmd |= (pItem->adr&0xFFFF) << 8; // адрес
360  cmd |= pItem->dev << 24; // узел
361 
362  BufOut[2*ii]=cmd;
363  BufOut[2*ii+1]=pItem->data;
364  }
365 
366  // Формирование промежуточного массива
367 
368  {
369  char *src=(char*)BufOut;
370  char *dst=(char*)Buf4BitOut;
371  int val;
372  for( int ii=0; ii<td->cmd_index*8; ii++ )
373  {
374  val = *src++;
375  *dst++ = 0xF0 | (val & 0xF);
376  *dst++ = 0xF0 | ((val>>4) & 0xF);
377  }
378  }
379 
380  // Передача массива
381  char *ptr = (char*)Buf4BitOut;
382 
383 
384  DWORD bytesWritten;
385  int size=td->cmd_index*16;
386  FT_STATUS ftStatus;
387  for( ; ; )
388  {
389  ftStatus=FT_Write( td->ftHandle, ptr, size, &bytesWritten );
390  size-=bytesWritten;
391  ptr+=bytesWritten;
392  if( 0==size )
393  break;
394  }
395 
396  // Приём ответа
397  ptr = (char*)Buf4BitIn;
398  size=td->cmd_index*16;
399  for( ; ; )
400  {
401  ftStatus=FT_Read( td->ftHandle, ptr, size, &bytesWritten );
402  size-=bytesWritten;
403  ptr+=bytesWritten;
404  if( 0==size )
405  break;
406  }
407 
408  // Формирование ответного массива из промежуточного
409  {
410  char val0, val1, val;
411  char *src=(char*)Buf4BitIn;
412  char *dst=(char*)BufIn;
413  for( int ii=0; ii<td->cmd_index*8; ii++ )
414  {
415  val0 = *src++;
416  val1 = *src++;
417  val = (val1<<4) | (val0&0x0F);
418  *dst++=val;
419  }
420 
421 
422  }
423 
424 
425 // for( int ii=0; ii<td->cmd_index; ii++ )
426 // {
427 // printf( "Write: %.8X %.8X\n", BufOut[2*ii], BufOut[2*ii+1] );
428 // }
429 
430 
431 // for( int ii=0; ii<td->cmd_index; ii++ )
432 // {
433 // printf( "Read: %.8X %.8X\n", BufIn[2*ii], BufIn[2*ii+1] );
434 // }
435 
436  for( int ii=0; ii<td->cmd_index; ii++ )
437  {
438  pItem = td->items + ii;
439  if( 0==pItem->cmd && pItem->pData )
440  {
441  *(pItem->pData)=BufIn[2*ii+1];
442  }
443 
444  }
445 
446 }
unsigned int cmd_index
номер текущей команды
Definition: tf_a7dac.cpp:24
int dev
узел
Definition: tf_a7dac.cpp:11
int adr
адрес
Definition: tf_a7dac.cpp:12
TF_A7Dac_TaskData * td
Внутренние данные класса
Definition: tf_a7dac.h:18
TF_A7Dac()
Definition: tf_a7dac.cpp:34
virtual ~TF_A7Dac()
Definition: tf_a7dac.cpp:39
int PldLoad(char *fname)
Загрузка прошивки ПЛИС
Definition: tf_a7dac.cpp:207
virtual void PkgCmdStart(void)
Начало выполнения команды
Definition: tf_a7dac.cpp:302
CMD_Item items[256]
массив команд
Definition: tf_a7dac.cpp:23
int * pData
указатель для чтения
Definition: tf_a7dac.cpp:14
FT_HANDLE ftHandle
дескриптор устройства
Definition: tf_a7dac.cpp:21
int Open(void)
Начало работы с модулем
Definition: tf_a7dac.cpp:45
int data
данные для записи
Definition: tf_a7dac.cpp:13
int cmd
команда, 1 - запись, 0 - чтение
Definition: tf_a7dac.cpp:15
int GetPldDone(void)
Проверка наличия прошивки
Definition: tf_a7dac.cpp:167
Внутренние данные класса
Definition: tf_a7dac.cpp:19
virtual void PkgCmdRead(int dev, int adr, int *pData)
Чтение из регистра
Definition: tf_a7dac.cpp:323
virtual void PkgCmdWrite(int dev, int adr, int data)
Запись в регистр
Definition: tf_a7dac.cpp:309
virtual void PkgCmdExecute(void)
Выполнение команды
Definition: tf_a7dac.cpp:337
unsigned int cmd_status
состояние команды
Definition: tf_a7dac.cpp:25