1 /**
2 * \file
3 *
4 * \brief ADP service implementation
5 *
6 * Copyright (C) 2015 Atmel Corporation. All rights reserved.
7 *
8 * \asf_license_start
9 *
10 * \page License
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions are met:
14 *
15 * 1. Redistributions of source code must retain the above copyright notice,
16 * this list of conditions and the following disclaimer.
17 *
18 * 2. Redistributions in binary form must reproduce the above copyright notice,
19 * this list of conditions and the following disclaimer in the documentation
20 * and/or other materials provided with the distribution.
21 *
22 * 3. The name of Atmel may not be used to endorse or promote products derived
23 * from this software without specific prior written permission.
24 *
25 * 4. This software may only be redistributed and used in connection with an
26 * Atmel microcontroller product.
27 *
28 * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
29 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
30 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
31 * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
32 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
36 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
37 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38 * POSSIBILITY OF SUCH DAMAGE.
39 *
40 * \asf_license_stop
41 *
42 */
43
44 #include <compiler.h>
45 #include <asf.h>
46 #include "adp_interface.h"
47
48 //! \name Embedded debugger TWI interface definitions
49 //@{
50 #define EDBG_TWI_MODULE TWI0
51 //@}
52
53 #define TWI_EDBG_SLAVE_ADDR 0x28
54 #define TIMEOUT 1000
55
56 /**
57 * \brief Initialize EDBG TWI interface for SAM4S
58 *
59 */
adp_interface_init(void)60 enum status_code adp_interface_init(void)
61 {
62 sysclk_init();
63
64 /* Configure the TWI interface */
65 twi_master_options_t opt = {
66 .speed = 100000,
67 .chip = TWI_EDBG_SLAVE_ADDR
68 };
69 return twi_master_setup(EDBG_TWI_MODULE, &opt);
70 }
71
72 /**
73 * \brief Send data on TWI
74 *
75 * \param[in] data Pointer to data to send
76 * \param[in] length Number of bytes to send
77 */
adp_interface_send(uint8_t * tx_buf,uint16_t length)78 static enum status_code adp_interface_send(uint8_t* tx_buf, uint16_t length)
79 {
80 twi_package_t packet_write = {
81 .chip = TWI_EDBG_SLAVE_ADDR, /* TWI slave bus address */
82 .buffer = tx_buf, /* transfer data source buffer */
83 .length = length /* transfer data size (bytes) */
84 };
85 return twi_master_write(EDBG_TWI_MODULE, &packet_write);
86 }
87
88 /**
89 * \brief Read data on TWI
90 *
91 * \param[out] data Pointer to place received data
92 * \param[in] length Number of bytes to receive
93 */
adp_interface_read_response(uint8_t * data,uint16_t length)94 enum status_code adp_interface_read_response(uint8_t *data, uint16_t length)
95 {
96 enum status_code status = ERR_IO_ERROR;
97 uint8_t data_len = 0;
98
99 twi_package_t packet_read = {
100 .chip = TWI_EDBG_SLAVE_ADDR, // TWI slave bus address
101 .buffer = &data_len, // transfer data destination buffer
102 .length = 1 // transfer data size (bytes)
103 };
104 twi_master_read(EDBG_TWI_MODULE, &packet_read);
105
106 if(data_len != 0){
107 packet_read.length = data_len;
108 packet_read.buffer = data;
109 status = twi_master_read(EDBG_TWI_MODULE, &packet_read);
110 }
111
112 return status;
113 }
114
115 /**
116 * \brief Sends and reads protocol packet data byte on I2C
117 *
118 * \param[in] tx_buf Pointer to send the protocol packet data
119 * \param[in] length The length of the send protocol packet data
120 * \param[out] rx_buf Pointer to store the received I2C character
121 */
adp_interface_transceive_procotol(uint8_t * tx_buf,uint16_t length,uint8_t * rx_buf)122 void adp_interface_transceive_procotol(uint8_t* tx_buf, uint16_t length, uint8_t* rx_buf)
123 {
124 adp_interface_send(tx_buf, length);
125 adp_interface_read_response(rx_buf, length);
126 }
127
128