OpenCores
URL https://opencores.org/ocsvn/w11/w11/trunk

Subversion Repositories w11

[/] [w11/] [tags/] [w11a_V0.6/] [tools/] [src/] [librlink/] [RlinkPortCuff.hpp] - Blame information for rev 24

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 19 wfjm
// $Id: RlinkPortCuff.hpp 502 2013-04-02 19:29:30Z mueller $
2 17 wfjm
//
3
// Copyright 2012-2013 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
4
//
5
// This program is free software; you may redistribute and/or modify it under
6
// the terms of the GNU General Public License as published by the Free
7
// Software Foundation, either version 2, or at your option any later version.
8
//
9
// This program is distributed in the hope that it will be useful, but
10
// WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
11
// or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12
// for complete details.
13
// 
14
// Revision History: 
15
// Date         Rev Version  Comment
16
// 2013-01-02   467   1.0.1  get cleanup code right; add USBErrorName()
17
// 2012-12-26   465   1.0    Initial version
18
// ---------------------------------------------------------------------------
19
 
20
 
21
/*!
22
  \file
23 19 wfjm
  \version $Id: RlinkPortCuff.hpp 502 2013-04-02 19:29:30Z mueller $
24 17 wfjm
  \brief   Declaration of class RlinkPortCuff.
25
*/
26
 
27
#ifndef included_Retro_RlinkPortCuff
28
#define included_Retro_RlinkPortCuff 1
29
 
30
#include "RlinkPort.hpp"
31
 
32
#include <poll.h>
33 19 wfjm
#include <libusb-1.0/libusb.h>
34 17 wfjm
 
35
#include <vector>
36 19 wfjm
#include <deque>
37 17 wfjm
 
38 19 wfjm
#include "boost/thread/thread.hpp"
39
 
40 17 wfjm
namespace Retro {
41
 
42
  class RlinkPortCuff : public RlinkPort {
43
    public:
44
 
45
                    RlinkPortCuff();
46
      virtual       ~RlinkPortCuff();
47
 
48
      virtual bool  Open(const std::string& url, RerrMsg& emsg);
49
      virtual void  Close();
50
 
51 19 wfjm
    // some constants (also defined in cpp)
52 17 wfjm
      static const size_t kUSBBufferSize  = 4096;  //!< USB buffer size
53
      static const int    kUSBWriteEP     = 4   ;  //!< USB write endpoint
54
      static const int    kUSBReadEP      = 6   ;  //!< USB read endpoint
55
      static const size_t kUSBReadQueue   = 2   ;  //!< USB read queue length
56
 
57
    // statistics counter indices
58
      enum stats {
59
        kStatNPollAddCB = RlinkPort::kDimStat,
60
        kStatNPollRemoveCB,
61
        kStatNUSBWrite,
62
        kStatNUSBRead,
63
        kDimStat
64
      };
65
 
66
    // event loop states
67
      enum loopState {
68
        kLoopStateStopped,
69
        kLoopStateRunning,
70
        kLoopStateStopping
71
      };
72
 
73
    protected:
74
      int           fFdReadDriver;          //!< fd for read (driver end)
75
      int           fFdWriteDriver;         //!< fd for write (driver end)
76
      boost::thread fDriverThread;          //!< driver thread
77
      libusb_context*  fpUsbContext;
78
      libusb_device**  fpUsbDevList;
79
      ssize_t          fUsbDevCount;
80
      libusb_device_handle* fpUsbDevHdl;
81
      loopState        fLoopState;
82
      std::vector<pollfd>   fPollFds;
83
      std::deque<libusb_transfer*>  fWriteQueueFree;
84
      std::deque<libusb_transfer*>  fWriteQueuePending;
85
      std::deque<libusb_transfer*>  fReadQueuePending;
86
 
87
    private:
88
      void          Cleanup();
89
      bool          OpenPipe(int& fdread, int& fdwrite, RerrMsg& emsg);
90
      void          Driver();
91
      void          DriverEventWritePipe();
92
      void          DriverEventUSB();
93
      libusb_transfer* NewWriteTransfer();
94
      bool          TraceOn();
95
      void          BadSysCall(const char* meth, const char* text, int rc);
96
      void          BadUSBCall(const char* meth, const char* text, int rc);
97
      void          CheckUSBTransfer(const char* meth, libusb_transfer *t);
98
      const char*   USBErrorName(int rc);
99
 
100
      void          PollfdAdd(int fd, short events);
101
      void          PollfdRemove(int fd);
102
      void          USBWriteDone(libusb_transfer* t);
103
      void          USBReadDone(libusb_transfer* t);
104
 
105
      static void   ThunkPollfdAdd(int fd, short events, void* udata);
106
      static void   ThunkPollfdRemove(int fd, void* udata);
107
      static void   ThunkUSBWriteDone(libusb_transfer* t);
108
      static void   ThunkUSBReadDone(libusb_transfer* t);
109
 
110
  };
111
 
112
} // end namespace Retro
113
 
114
//#include "RlinkPortCuff.ipp"
115
 
116
#endif

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.