root/trunk/libffado/src/fireworks/fireworks_device.h

Revision 2452, 4.6 kB (checked in by mocchi, 5 years ago)

[Fireworks] add a workaround for Audiofire12 (and maybe Audiofire8)

EfcGetClockCmd? over FCP is often failed or return invalid data. This commit add retry for doEfcOverFCP().

When the trials are completely failed, for sampling rate operation, a fallback to 'input/output plug signal format' command is executed. This command seems to be supported by all models.

But the driver can't know current clock source via 'plug signal format' command. This commit add 'm_current_clock' member to keep the id. This member is updated by setClock(). When getClock() is faled even if this member is not set, fallback to internal clock.

Line 
1 /*
2  * Copyright (C) 2005-2008 by Daniel Wagner
3  * Copyright (C) 2005-2008 by Pieter Palmers
4  *
5  * This file is part of FFADO
6  * FFADO = Free Firewire (pro-)audio drivers for linux
7  *
8  * FFADO is based upon FreeBoB.
9  *
10  * This program is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation, either version 2 of the License, or
13  * (at your option) version 3 of the License.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
22  *
23  */
24
25 #ifndef FIREWORKS_DEVICE_H
26 #define FIREWORKS_DEVICE_H
27
28 #include "debugmodule/debugmodule.h"
29
30 #include "genericavc/avc_avdevice.h"
31
32 #include "efc/efc_cmd.h"
33 #include "efc/efc_cmds_hardware.h"
34 #include "fireworks_session_block.h"
35
36 #include <pthread.h>
37 #include "libutil/Mutex.h"
38
39 class ConfigRom;
40 class Ieee1394Service;
41
42 namespace FireWorks {
43
44 class Device : public GenericAVC::Device {
45     friend class MonitorControl;
46     friend class SimpleControl;
47     friend class BinaryControl;
48     friend class IOConfigControl;
49    
50 public:
51     Device( DeviceManager& d, std::auto_ptr<ConfigRom>( configRom ) );
52     virtual ~Device();
53    
54     static bool probe( Util::Configuration&, ConfigRom& configRom, bool generic = false );
55     static FFADODevice * createDevice( DeviceManager& d, std::auto_ptr<ConfigRom>( configRom ));
56     virtual bool discover();
57
58     virtual void showDevice();
59    
60     virtual bool buildMixer();
61     virtual bool destroyMixer();
62
63     virtual std::vector<int> getSupportedSamplingFrequencies();
64
65     virtual ClockSourceVector getSupportedClockSources();
66     virtual bool setActiveClockSource(ClockSource);
67     virtual ClockSource getActiveClockSource();
68     virtual int getSamplingFrequency();
69     virtual bool setSamplingFrequency( int );
70
71     const EfcHardwareInfoCmd getHwInfo()
72         {return m_HwInfo;};
73
74 // protected: //?
75     bool doEfcOverAVC(EfcCmd& c);
76    
77     /**
78      * @brief Read flash
79      * @param start start address
80      * @param len length in quadlets (4 bytes)
81      * @param buffer target buffer (should be 'len*4' bytes long)
82      * @return true if successful
83      */
84     bool readFlash(uint32_t start, uint32_t len, uint32_t* buffer);
85
86     /**
87      * @brief Write flash
88      * @param start start address
89      * @param len length in quadlets (4 bytes)
90      * @param buffer target buffer (should be 'len*4' bytes long)
91      * @return true if successful
92      */
93     bool writeFlash(uint32_t start, uint32_t len, uint32_t* buffer);
94
95     /**
96      * @brief (un)lock the flash
97      * @param lock true=locked, false=unlocked
98      * @return true if successful
99      */
100     bool lockFlash(bool lock);
101     /**
102      * @brief erase flash block
103      * @param addr address of block to erase
104      * @return true if successful
105      */
106     bool eraseFlash(uint32_t addr);
107     bool eraseFlashBlocks(uint32_t start_address, unsigned int nb_quads);
108
109     /**
110      * @brief wait until the device indicates the flash memory is ready
111      * @param msecs time to wait before timeout
112      * @return true if the flash is ready, false if timeout
113      */
114     bool waitForFlash(unsigned int msecs);
115
116     /**
117      * @brief get the flash address of the session block
118      * @return session block base address
119      */
120     uint32_t getSessionBase();
121
122     /**
123      * load the session block from the device
124      * @return true if successful
125      */
126     bool loadSession();
127     /**
128      * save the session block to the device
129      * @return true if successful
130      */
131     bool saveSession();
132
133 // Echo specific stuff
134 private:
135    
136     bool discoverUsingEFC();
137
138     FFADODevice::ClockSource clockIdToClockSource(uint32_t clockflag);
139     bool isClockValid(uint32_t id);
140     uint32_t getClock();
141     bool setClock(uint32_t);
142
143     /*
144      * Audiofire12 often return wrong data for clock source.
145      * This member is used to cache the latest clock source change.
146      */
147     int m_current_clock;
148
149     uint32_t            m_efc_version;
150
151     EfcHardwareInfoCmd  m_HwInfo;
152
153     bool updatePolledValues();
154     Util::Mutex*        m_poll_lock;
155     EfcPolledValuesCmd  m_Polled;
156
157     bool                m_efc_discovery_done;
158
159 protected:
160     Session             m_session;
161 private:
162     Control::Container *m_MixerContainer;
163     Control::Container *m_HwInfoContainer;
164
165 };
166
167
168 } // namespace FireWorks
169
170 #endif
Note: See TracBrowser for help on using the browser.