Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-dev by
targets/TARGET_ONSEMI/TARGET_NCS36510/port_api.c@165:2dd56e6daeec, 2017-05-23 (annotated)
- Committer:
- ranaumarnaeem
- Date:
- Tue May 23 12:54:50 2017 +0000
- Revision:
- 165:2dd56e6daeec
- Parent:
- 150:02e0a0aed4ec
jhjg
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
<> | 144:ef7eb2e8f9f7 | 1 | /** |
<> | 144:ef7eb2e8f9f7 | 2 | ****************************************************************************** |
<> | 144:ef7eb2e8f9f7 | 3 | * @file port_api.c |
<> | 144:ef7eb2e8f9f7 | 4 | * @brief Implementation of a port API |
<> | 144:ef7eb2e8f9f7 | 5 | * @internal |
<> | 144:ef7eb2e8f9f7 | 6 | * @author ON Semiconductor |
<> | 144:ef7eb2e8f9f7 | 7 | * $Rev: |
<> | 144:ef7eb2e8f9f7 | 8 | * $Date: |
<> | 144:ef7eb2e8f9f7 | 9 | ****************************************************************************** |
<> | 147:30b64687e01f | 10 | * Copyright 2016 Semiconductor Components Industries LLC (d/b/a ON Semiconductor). |
<> | 147:30b64687e01f | 11 | * All rights reserved. This software and/or documentation is licensed by ON Semiconductor |
<> | 147:30b64687e01f | 12 | * under limited terms and conditions. The terms and conditions pertaining to the software |
<> | 147:30b64687e01f | 13 | * and/or documentation are available at http://www.onsemi.com/site/pdf/ONSEMI_T&C.pdf |
<> | 147:30b64687e01f | 14 | * (ON Semiconductor Standard Terms and Conditions of Sale, Section 8 Software) and |
<> | 147:30b64687e01f | 15 | * if applicable the software license agreement. Do not use this software and/or |
<> | 147:30b64687e01f | 16 | * documentation unless you have carefully read and you agree to the limited terms and |
<> | 147:30b64687e01f | 17 | * conditions. By using this software and/or documentation, you agree to the limited |
<> | 147:30b64687e01f | 18 | * terms and conditions. |
<> | 144:ef7eb2e8f9f7 | 19 | * |
<> | 144:ef7eb2e8f9f7 | 20 | * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED |
<> | 144:ef7eb2e8f9f7 | 21 | * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF |
<> | 144:ef7eb2e8f9f7 | 22 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. |
<> | 144:ef7eb2e8f9f7 | 23 | * ON SEMICONDUCTOR SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, |
<> | 144:ef7eb2e8f9f7 | 24 | * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. |
<> | 144:ef7eb2e8f9f7 | 25 | */ |
<> | 144:ef7eb2e8f9f7 | 26 | #include "gpio.h" |
<> | 150:02e0a0aed4ec | 27 | #include "gpio_api.h" |
<> | 144:ef7eb2e8f9f7 | 28 | #include "port_api.h" |
<> | 150:02e0a0aed4ec | 29 | #include "pinmap.h" |
<> | 144:ef7eb2e8f9f7 | 30 | |
<> | 144:ef7eb2e8f9f7 | 31 | #if DEVICE_PORTIN || DEVICE_PORTOUT |
<> | 144:ef7eb2e8f9f7 | 32 | |
<> | 144:ef7eb2e8f9f7 | 33 | /** Get the pin name from the port's pin number |
<> | 144:ef7eb2e8f9f7 | 34 | * |
<> | 144:ef7eb2e8f9f7 | 35 | * @param port The port name |
<> | 144:ef7eb2e8f9f7 | 36 | * @param pin_n The pin number within the specified port |
<> | 144:ef7eb2e8f9f7 | 37 | * @return The pin name for the port's pin number |
<> | 144:ef7eb2e8f9f7 | 38 | */ |
<> | 144:ef7eb2e8f9f7 | 39 | PinName port_pin(PortName port, int pin_n) |
<> | 144:ef7eb2e8f9f7 | 40 | { |
<> | 144:ef7eb2e8f9f7 | 41 | return((PinName)(pin_n)); |
<> | 144:ef7eb2e8f9f7 | 42 | } |
<> | 144:ef7eb2e8f9f7 | 43 | |
<> | 144:ef7eb2e8f9f7 | 44 | /** Initilize the port |
<> | 144:ef7eb2e8f9f7 | 45 | * |
<> | 144:ef7eb2e8f9f7 | 46 | * @param obj The port object to initialize |
<> | 144:ef7eb2e8f9f7 | 47 | * @param port The port name |
<> | 144:ef7eb2e8f9f7 | 48 | * @param mask The bitmask to identify which bits in the port should be included (0 - ignore) |
<> | 144:ef7eb2e8f9f7 | 49 | * @param dir The port direction |
<> | 144:ef7eb2e8f9f7 | 50 | */ |
<> | 144:ef7eb2e8f9f7 | 51 | void port_init(port_t *obj, PortName port, int mask, PinDirection dir) |
<> | 144:ef7eb2e8f9f7 | 52 | { |
<> | 144:ef7eb2e8f9f7 | 53 | uint8_t i; |
<> | 144:ef7eb2e8f9f7 | 54 | PinName pin; |
<> | 144:ef7eb2e8f9f7 | 55 | |
<> | 144:ef7eb2e8f9f7 | 56 | /* Store the port mask in obj */ |
<> | 144:ef7eb2e8f9f7 | 57 | obj->mask = mask; |
<> | 144:ef7eb2e8f9f7 | 58 | |
<> | 144:ef7eb2e8f9f7 | 59 | /* Store the port name in obj */ |
<> | 144:ef7eb2e8f9f7 | 60 | obj->port = port; |
<> | 144:ef7eb2e8f9f7 | 61 | |
<> | 144:ef7eb2e8f9f7 | 62 | /* Store GPIO base address */ |
<> | 144:ef7eb2e8f9f7 | 63 | obj->GPIOMEMBASE = GPIOREG; |
<> | 144:ef7eb2e8f9f7 | 64 | |
<> | 144:ef7eb2e8f9f7 | 65 | for (i=0; i<NUMBER_OF_GPIO; i++) { |
<> | 144:ef7eb2e8f9f7 | 66 | /* check for valid pin */ |
<> | 144:ef7eb2e8f9f7 | 67 | if (obj->mask & (1<<i)) { |
<> | 144:ef7eb2e8f9f7 | 68 | |
<> | 144:ef7eb2e8f9f7 | 69 | /* Gpio numbers start from DIO#0 to #17, so can pass in "i" */ |
<> | 144:ef7eb2e8f9f7 | 70 | pin = port_pin(obj->port, i); |
<> | 144:ef7eb2e8f9f7 | 71 | |
<> | 144:ef7eb2e8f9f7 | 72 | /* Set the pin as GPIO */ |
<> | 144:ef7eb2e8f9f7 | 73 | gpio_set(pin); |
<> | 144:ef7eb2e8f9f7 | 74 | } |
<> | 144:ef7eb2e8f9f7 | 75 | } |
<> | 144:ef7eb2e8f9f7 | 76 | |
<> | 144:ef7eb2e8f9f7 | 77 | /* Call function to set pin direction */ |
<> | 144:ef7eb2e8f9f7 | 78 | port_dir(obj, dir); |
<> | 144:ef7eb2e8f9f7 | 79 | } |
<> | 144:ef7eb2e8f9f7 | 80 | |
<> | 144:ef7eb2e8f9f7 | 81 | /** Set the input port mode |
<> | 144:ef7eb2e8f9f7 | 82 | * |
<> | 144:ef7eb2e8f9f7 | 83 | * @param obj The port object |
<> | 144:ef7eb2e8f9f7 | 84 | * @param mode THe port mode to be set |
<> | 144:ef7eb2e8f9f7 | 85 | */ |
<> | 144:ef7eb2e8f9f7 | 86 | void port_mode(port_t *obj, PinMode mode) |
<> | 144:ef7eb2e8f9f7 | 87 | { |
<> | 144:ef7eb2e8f9f7 | 88 | uint8_t i = 0; |
<> | 144:ef7eb2e8f9f7 | 89 | PinName pin; |
<> | 144:ef7eb2e8f9f7 | 90 | |
<> | 144:ef7eb2e8f9f7 | 91 | /* For each pin in the mask, set the mode to that defined in "mode" parameter */ |
<> | 144:ef7eb2e8f9f7 | 92 | for (i=0; i < NUMBER_OF_GPIO; i++) { |
<> | 144:ef7eb2e8f9f7 | 93 | /* check for valid pin */ |
<> | 144:ef7eb2e8f9f7 | 94 | if (obj->mask & (1<<i)) { |
<> | 144:ef7eb2e8f9f7 | 95 | |
<> | 144:ef7eb2e8f9f7 | 96 | /* get the pin name */ |
<> | 144:ef7eb2e8f9f7 | 97 | pin = port_pin(obj->port, i); |
<> | 144:ef7eb2e8f9f7 | 98 | |
<> | 144:ef7eb2e8f9f7 | 99 | /* Set the mode for the pin */ |
<> | 144:ef7eb2e8f9f7 | 100 | pin_mode(pin, mode); |
<> | 144:ef7eb2e8f9f7 | 101 | } |
<> | 144:ef7eb2e8f9f7 | 102 | } |
<> | 144:ef7eb2e8f9f7 | 103 | } |
<> | 144:ef7eb2e8f9f7 | 104 | |
<> | 144:ef7eb2e8f9f7 | 105 | /** Set port direction (in/out) |
<> | 144:ef7eb2e8f9f7 | 106 | * |
<> | 144:ef7eb2e8f9f7 | 107 | * @param obj The port object |
<> | 144:ef7eb2e8f9f7 | 108 | * @param dir The port direction to be set |
<> | 144:ef7eb2e8f9f7 | 109 | */ |
<> | 144:ef7eb2e8f9f7 | 110 | void port_dir(port_t *obj, PinDirection dir) |
<> | 144:ef7eb2e8f9f7 | 111 | { |
<> | 144:ef7eb2e8f9f7 | 112 | /* Enable the GPIO clock */ |
<> | 144:ef7eb2e8f9f7 | 113 | CLOCK_ENABLE(CLOCK_GPIO); |
<> | 144:ef7eb2e8f9f7 | 114 | |
<> | 144:ef7eb2e8f9f7 | 115 | if (dir == PIN_INPUT) { |
<> | 144:ef7eb2e8f9f7 | 116 | obj->GPIOMEMBASE->W_IN = obj->mask; |
<> | 144:ef7eb2e8f9f7 | 117 | } else if (dir == PIN_OUTPUT) { |
<> | 144:ef7eb2e8f9f7 | 118 | obj->GPIOMEMBASE->W_OUT = obj->mask; |
<> | 144:ef7eb2e8f9f7 | 119 | } |
<> | 144:ef7eb2e8f9f7 | 120 | |
<> | 144:ef7eb2e8f9f7 | 121 | /* Disable the GPIO clock */ |
<> | 144:ef7eb2e8f9f7 | 122 | CLOCK_DISABLE(CLOCK_GPIO); |
<> | 144:ef7eb2e8f9f7 | 123 | } |
<> | 144:ef7eb2e8f9f7 | 124 | |
<> | 144:ef7eb2e8f9f7 | 125 | /** Write value to the port |
<> | 144:ef7eb2e8f9f7 | 126 | * |
<> | 144:ef7eb2e8f9f7 | 127 | * @param obj The port object |
<> | 144:ef7eb2e8f9f7 | 128 | * @param value The value to be set |
<> | 144:ef7eb2e8f9f7 | 129 | */ |
<> | 144:ef7eb2e8f9f7 | 130 | void port_write(port_t *obj, int value) |
<> | 144:ef7eb2e8f9f7 | 131 | { |
<> | 144:ef7eb2e8f9f7 | 132 | /* Enable the GPIO clock */ |
<> | 144:ef7eb2e8f9f7 | 133 | CLOCK_ENABLE(CLOCK_GPIO); |
<> | 144:ef7eb2e8f9f7 | 134 | |
<> | 144:ef7eb2e8f9f7 | 135 | obj->GPIOMEMBASE->R_STATE_W_SET = value;//(obj->mask & value); |
<> | 144:ef7eb2e8f9f7 | 136 | obj->GPIOMEMBASE->R_IRQ_W_CLEAR = ~value;//(obj->mask ^ value); |
<> | 144:ef7eb2e8f9f7 | 137 | |
<> | 144:ef7eb2e8f9f7 | 138 | /* Disable the GPIO clock */ |
<> | 144:ef7eb2e8f9f7 | 139 | CLOCK_DISABLE(CLOCK_GPIO); |
<> | 144:ef7eb2e8f9f7 | 140 | } |
<> | 144:ef7eb2e8f9f7 | 141 | |
<> | 144:ef7eb2e8f9f7 | 142 | /** Read the current value on the port |
<> | 144:ef7eb2e8f9f7 | 143 | * |
<> | 144:ef7eb2e8f9f7 | 144 | * @param obj The port object |
<> | 144:ef7eb2e8f9f7 | 145 | * @return An integer with each bit corresponding to an associated port pin setting |
<> | 144:ef7eb2e8f9f7 | 146 | */ |
<> | 144:ef7eb2e8f9f7 | 147 | int port_read(port_t *obj) |
<> | 144:ef7eb2e8f9f7 | 148 | { |
<> | 144:ef7eb2e8f9f7 | 149 | int gpio_level = 0; |
<> | 144:ef7eb2e8f9f7 | 150 | |
<> | 144:ef7eb2e8f9f7 | 151 | /* Enable the GPIO clock */ |
<> | 144:ef7eb2e8f9f7 | 152 | CLOCK_ENABLE(CLOCK_GPIO); |
<> | 144:ef7eb2e8f9f7 | 153 | |
<> | 144:ef7eb2e8f9f7 | 154 | gpio_level = obj->GPIOMEMBASE->R_STATE_W_SET; |
<> | 144:ef7eb2e8f9f7 | 155 | |
<> | 144:ef7eb2e8f9f7 | 156 | /* Disable the GPIO clock */ |
<> | 144:ef7eb2e8f9f7 | 157 | CLOCK_DISABLE(CLOCK_GPIO); |
<> | 144:ef7eb2e8f9f7 | 158 | |
<> | 144:ef7eb2e8f9f7 | 159 | return(gpio_level); |
<> | 144:ef7eb2e8f9f7 | 160 | } |
<> | 144:ef7eb2e8f9f7 | 161 | |
<> | 144:ef7eb2e8f9f7 | 162 | #endif |