1 /*******************************************************************************
2 * Copyright (C) 2015 Maxim Integrated Products, Inc., All Rights Reserved.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
22 * Except as contained in this notice, the name of Maxim Integrated
23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
24 * Products, Inc. Branding Policy.
26 * The mere transfer of this software does not imply any licenses
27 * of trade secrets, proprietary technology, copyrights, patents,
28 * trademarks, maskwork rights, or any other form of intellectual
29 * property whatsoever. Maxim Integrated Products, Inc. retains all
31 *******************************************************************************
37 #include "gpio_regs.h"
38 #include "clkman_regs.h"
40 PinName
port_pin(PortName port
, int pin_n
)
42 return (PinName
)((port
<< PORT_SHIFT
) | pin_n
);
45 void port_init(port_t
*obj
, PortName port
, int mask
, PinDirection dir
)
49 obj
->reg_out
= &MXC_GPIO
->out_val
[port
];
50 obj
->reg_in
= &MXC_GPIO
->in_val
[port
];
52 /* Ensure that the GPIO clock is enabled */
53 if (MXC_CLKMAN
->clk_ctrl_1_gpio
== MXC_E_CLKMAN_CLK_SCALE_DISABLED
) {
54 MXC_CLKMAN
->clk_ctrl_1_gpio
= MXC_E_CLKMAN_CLK_SCALE_ENABLED
;
58 // The function is set per pin: reuse gpio logic
59 for (i
=0; i
<32; i
++) {
60 if (obj
->mask
& (1<<i
)) {
61 gpio_set(port_pin(obj
->port
, i
));
62 pin_dir(port_pin(obj
->port
, i
), dir
);
67 void port_mode(port_t
*obj
, PinMode mode
)
70 // The mode is set per pin: reuse pinmap logic
71 for (i
=0; i
<32; i
++) {
72 if (obj
->mask
& (1<<i
)) {
73 pin_mode(port_pin(obj
->port
, i
), mode
);
78 void port_dir(port_t
*obj
, PinDirection dir
)
81 // The mode is set per pin: reuse gpio logic
82 for (i
=0; i
<32; i
++) {
83 if (obj
->mask
& (1<<i
)) {
84 pin_dir(port_pin(obj
->port
, i
), dir
);
89 void port_write(port_t
*obj
, int value
)
91 *obj
->reg_out
= (*obj
->reg_out
& ~obj
->mask
) | (value
& obj
->mask
);
94 int port_read(port_t
*obj
)
96 return (*obj
->reg_in
& obj
->mask
);