Kinetis Bootloader Host  2.0.0
Host Tools for Kinetis devices
BusPal.h
1 /*
2  * Copyright (c) 2013-14, Freescale Semiconductor, Inc.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without modification,
6  * are permitted provided that the following conditions are met:
7  *
8  * o Redistributions of source code must retain the above copyright notice, this list
9  * of conditions and the following disclaimer.
10  *
11  * o Redistributions in binary form must reproduce the above copyright notice, this
12  * list of conditions and the following disclaimer in the documentation and/or
13  * other materials provided with the distribution.
14  *
15  * o Neither the name of Freescale Semiconductor, Inc. nor the names of its
16  * contributors may be used to endorse or promote products derived from this
17  * software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
23  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 #ifndef _BusPal_h_
32 #define _BusPal_h_
33 
34 #include "host_types.h"
35 
38 
39 namespace blfwk
40 {
48 class BusPal
49 {
50 public:
52  enum
53  {
54  kResetCount = 20,
55  kResponseOk = 0x01,
58  };
60 
63  {
64  kBusPalFunction_None,
65  kBusPalFunction_SPI,
66  kBusPalFunction_I2C,
67  kBusPalFunction_CAN,
68  kBusPalFunction_GPIO_CONFIG,
69  kBusPalFunction_GPIO_SET,
70  kBusPalFunction_FPGA_CLOCK_SET
71  };
72 
75  {
78  };
79 
82  {
84  0,
86  1
87  };
88 
91  {
94  };
95 
97  static const uint8_t kBusPalDefaultI2cSlaveAddress = 0x10; // I2C Slave 7-bit address
98 
99 public:
102  {
103  bus_pal_function_t function;
104  uint32_t spiSpeedKHz;
105  spi_clock_polarity_t spiPolarity;
106  spi_clock_phase_t spiPhase;
107  spi_shift_direction_t spiDirection;
108  uint8_t i2cAddress;
109  uint32_t i2cSpeedKHz;
110  uint32_t canSpeed;
111  uint32_t canTxid;
112  uint32_t canRxid;
113  uint8_t gpioPort;
114  uint8_t gpioPinNum;
115  uint8_t gpioLevel;
116  uint8_t gpioMux;
117  uint32_t fpgaClockMhz;
118 
119  BusPalConfigData(bus_pal_function_t bus = BusPal::kBusPalFunction_None)
120  : function(bus)
121  {
122  spiSpeedKHz = 100;
125  spiDirection = BusPal::kSpiMsbFirst;
127  i2cSpeedKHz = 100;
128  canSpeed = 4; // 4: 1M
129  canTxid = 0x321;
130  canRxid = 0x123;
131  gpioPort = 0;
132  gpioPinNum = 0;
133  gpioLevel = 0;
134  gpioMux = 0;
135  fpgaClockMhz = 0;
136  }
137  };
138 
140  BusPal(int fileDescriptor);
141 
143  virtual ~BusPal(){};
144 
146  static bool parse(const string_vector_t &params, BusPal::BusPalConfigData &config);
147 
149  virtual bool reset();
150 
152  virtual bool resetHardware();
153 
157  virtual bool enterBitBangMode();
158 
160  virtual bool enterSpiMode();
161 
163  virtual bool enterCanMode();
164 
166  virtual bool enterI2cMode();
167 
169  virtual bool enterUartMode() { return false; }
171  virtual bool enter1WireMode() { return false; }
173  virtual bool enterRawWireMode() { return false; }
175  virtual bool rawConfigurePins(uint8_t port, uint8_t pin, uint8_t muxVal);
176 
178  virtual bool rawSetPins(uint8_t port, uint8_t pin, uint8_t level);
179 
181  virtual bool configurePins(uint8_t config = 0) { return true; }
183  virtual uint8_t readPins() { return 0; }
185  virtual bool setFPGAClock(uint32_t clock);
186 
188  virtual bool setSpiSpeed(unsigned int speed);
189 
191  virtual bool setSpiConfig(spi_clock_polarity_t polarity, spi_clock_phase_t phase, spi_shift_direction_t direction);
192 
194  virtual bool setI2cAddress(uint8_t address);
195 
197  virtual bool setI2cSpeed(uint32_t speed);
198 
200  virtual bool setCanSpeed(unsigned int speed);
201 
203  virtual bool setCanTxid(unsigned int txid);
204 
206  virtual bool setCanRxid(unsigned int rxid);
207 
212  virtual uint8_t *response(size_t byteCount = 1);
213 
215  virtual bool write(const uint8_t *data, size_t byteCount = 1);
216 
218  virtual int read(uint8_t *data, size_t byteCount);
219 
220 protected:
222  virtual bool writeCommand(uint8_t commandByte, const char *expectedResponse);
223 
225  virtual uint8_t writeCommand(uint8_t commandByte);
226 
228  virtual uint8_t writeCommand(uint8_t *command, unsigned int length);
229 
231  virtual bool writeSpi(const uint8_t *data, size_t byteCount = 1);
232 
234  virtual bool writeI2c(const uint8_t *data, size_t byteCount = 1);
235 
237  virtual bool writeCan(const uint8_t *data, size_t byteCount = 1);
238 
240  virtual int readSpi(uint8_t *data, size_t byteCount);
241 
243  virtual int readCan(uint8_t *data, size_t byteCount);
244 
246  int readSpiActual(uint8_t *data, size_t byteCount);
247 
249  virtual int readI2c(uint8_t *data, size_t byteCount);
250 
252  int buspal_serial_read(uint8_t *buf, int size, bool isCommandData = false);
253 
255  int buspal_serial_write(uint8_t *buf, int size, bool isCommandData = false);
256 
258  void flushRX();
259 
260 protected:
261  enum bus_pal_mode_t
262  {
263  kBusPalModeBitBang,
264  kBusPalModeSpi,
265  kBusPalModeI2c,
266  kBusPalModeCan
267  };
270  bus_pal_mode_t m_mode;
271  unsigned int m_spiWriteByteCount;
272  unsigned int m_canWriteByteCount;
273  unsigned int m_canFirstReadDelay;
274 };
275 
276 } // namespace blfwk
277 
279 
280 #endif // _BusPal_h_
281 
283 // EOF
virtual bool setCanTxid(unsigned int txid)
Set CAN txid.
Definition: BusPal.cpp:439
spi_shift_direction_t
SPI data shifter direction options.
Definition: BusPal.h:90
virtual bool enterBitBangMode()
Enter bit bang (binary scripting) mode.
Definition: BusPal.cpp:499
Interface with the BusPal.
Definition: BusPal.h:48
uint8_t m_responseBuffer[kMaxResponse]
Command response buffer.
Definition: BusPal.h:269
Definition: BlfwkErrors.h:16
virtual bool writeCommand(uint8_t commandByte, const char *expectedResponse)
Write command, check string response.
Definition: BusPal.cpp:522
virtual bool enterRawWireMode()
Enter raw wire mode. Not currently supported for bus pal.
Definition: BusPal.h:173
Active-low SPI clock (idles high).
Definition: BusPal.h:77
Successful command response.
Definition: BusPal.h:55
virtual bool setI2cSpeed(uint32_t speed)
Set I2c speed.
Definition: BusPal.cpp:694
virtual bool setSpiSpeed(unsigned int speed)
Set SPI speed.
Definition: BusPal.cpp:662
virtual bool writeI2c(const uint8_t *data, size_t byteCount=1)
write via I2c
Definition: BusPal.cpp:1014
int buspal_serial_write(uint8_t *buf, int size, bool isCommandData=false)
Overriden serial_write for logging.
Definition: BusPal.cpp:1148
virtual int readI2c(uint8_t *data, size_t byteCount)
read via I2c
Definition: BusPal.cpp:1053
virtual bool write(const uint8_t *data, size_t byteCount=1)
writes the data over the previously selected interface
Definition: BusPal.cpp:757
Data transfers start with least significant bit.
Definition: BusPal.h:93
Definition: BusPal.h:57
First edge on SPSCK occurs at the middle of the first cycle of a data transfer.
Definition: BusPal.h:83
int m_fileDescriptor
PC COM port file descriptor.
Definition: BusPal.h:268
BusPal configuration data.
Definition: BusPal.h:101
virtual bool rawConfigurePins(uint8_t port, uint8_t pin, uint8_t muxVal)
Raw configure pins.
Definition: BusPal.cpp:709
int readSpiActual(uint8_t *data, size_t byteCount)
worker function to actually read SPI data
Definition: BusPal.cpp:856
virtual bool enterCanMode()
Enter Can mode.
Definition: BusPal.cpp:426
virtual bool setCanRxid(unsigned int rxid)
Set CAN rxid.
Definition: BusPal.cpp:455
bus_pal_function_t
BusPal Transports.
Definition: BusPal.h:62
virtual bool setFPGAClock(uint32_t clock)
Sets the FPGA clock, clock is in hertz.
Definition: BusPal.cpp:741
virtual int readSpi(uint8_t *data, size_t byteCount)
read via Spi
Definition: BusPal.cpp:850
Max number of nulls to send to enter BBIO mode.
Definition: BusPal.h:54
virtual uint8_t readPins()
Read pins.
Definition: BusPal.h:183
virtual bool enterI2cMode()
Enter I2c mode.
Definition: BusPal.cpp:486
virtual bool enter1WireMode()
Enter 1wire mode. Not currently supported for bus pal.
Definition: BusPal.h:171
virtual bool enterSpiMode()
Enter Spi mode.
Definition: BusPal.cpp:414
virtual ~BusPal()
Destructor.
Definition: BusPal.h:143
void flushRX()
Flushes the serial port of any RX data.
Definition: BusPal.cpp:258
int buspal_serial_read(uint8_t *buf, int size, bool isCommandData=false)
Overriden serial_read for logging.
Definition: BusPal.cpp:1103
virtual bool rawSetPins(uint8_t port, uint8_t pin, uint8_t level)
Set GPIO pin.
Definition: BusPal.cpp:725
static bool parse(const string_vector_t &params, BusPal::BusPalConfigData &config)
parse the passed in options into the config structure.
Definition: BusPal.cpp:283
spi_clock_polarity_t
SPI clock polarity configuration.
Definition: BusPal.h:74
virtual bool configurePins(uint8_t config=0)
Configure pins.
Definition: BusPal.h:181
spi_clock_phase_t
SPI clock phase configuration.
Definition: BusPal.h:81
virtual bool reset()
Reset to bit bang mode from another peripheral mode.
Definition: BusPal.cpp:616
virtual int readCan(uint8_t *data, size_t byteCount)
read via Can
Definition: BusPal.cpp:953
virtual int read(uint8_t *data, size_t byteCount)
Read data.
Definition: BusPal.cpp:773
virtual bool setSpiConfig(spi_clock_polarity_t polarity, spi_clock_phase_t phase, spi_shift_direction_t direction)
Sets the SPI configuration.
Definition: BusPal.cpp:644
Max number of bytes per bulk transfer.
Definition: BusPal.h:56
virtual bool writeCan(const uint8_t *data, size_t byteCount=1)
write via Can
Definition: BusPal.cpp:907
virtual bool writeSpi(const uint8_t *data, size_t byteCount=1)
write via Spi
Definition: BusPal.cpp:808
Data transfers start with most significant bit.
Definition: BusPal.h:92
First edge on SPSCK occurs at the start of the first cycle of a data transfer.
Definition: BusPal.h:85
virtual bool resetHardware()
Reset the bus pal, comes up in terminal mode.
Definition: BusPal.cpp:604
virtual uint8_t * response(size_t byteCount=1)
Read response.
Definition: BusPal.cpp:581
virtual bool enterUartMode()
Enter Uart mode. Not currently supported for bus pal.
Definition: BusPal.h:169
Active-high SPI clock (idles low).
Definition: BusPal.h:76
virtual bool setCanSpeed(unsigned int speed)
Set CAN speed.
Definition: BusPal.cpp:471
virtual bool setI2cAddress(uint8_t address)
Set I2c address.
Definition: BusPal.cpp:678
BusPal(int fileDescriptor)
Constructor.
Definition: BusPal.cpp:275
static const uint8_t kBusPalDefaultI2cSlaveAddress
I2C default address.
Definition: BusPal.h:97