source: azure_iot_hub_f767zi/trunk/asp_baseplatform/pdic/stm32f7xx/pinmode.c@ 457

Last change on this file since 457 was 457, checked in by coas-nagasima, 4 years ago

ファイルを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 8.4 KB
Line 
1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2004-2012 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 * Copyright (C) 2015-2016 by TOPPERS PROJECT Educational Working Group.
11 *
12 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
13 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
14 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
15 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * スコード中に含まれていること.
18 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
20 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
21 * の無保証規定を掲載すること.
22 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
23 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
24 * と.
25 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
26 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
27 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
28 * 報告すること.
29 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
30 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
31 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
32 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
33 * 免責すること.
34 *
35 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
36 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
37 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
38 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
39 * の責任を負わない.
40 *
41 * $Id$
42 */
43
44/*
45 * ARDUNO-PINドライバ
46 */
47
48#include <kernel.h>
49#include <t_syslog.h>
50#include <t_stdlib.h>
51#include <string.h>
52#include <target_syssvc.h>
53#include "syssvc/serial.h"
54#include "syssvc/syslog.h"
55#include "kernel_cfg.h"
56#include "device.h"
57#include "pinmode.h"
58
59#define sil_orw_mem(a, b) sil_wrw_mem((a), sil_rew_mem(a) | (b))
60#define sil_andw_mem(a, b) sil_wrw_mem((a), sil_rew_mem(a) & ~(b))
61#define sil_modw_mem(a, b, c) sil_wrw_mem((a), (sil_rew_mem(a) & (~b)) | (c))
62
63
64static const Arduino_PortControlBlock Digital_Port[] = {
65#if defined(TOPPERS_STM32F7_DISCOVERY)
66 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOCEN, TADR_GPIOC_BASE, 7}, /* D0 */
67 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOCEN, TADR_GPIOC_BASE, 6}, /* D1 */
68 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOGEN, TADR_GPIOG_BASE, 6}, /* D2 */
69 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOBEN, TADR_GPIOB_BASE, 4}, /* D3 */
70 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOGEN, TADR_GPIOG_BASE, 7}, /* D4 */
71 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOAEN, TADR_GPIOA_BASE, 8}, /* D5 */
72 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOHEN, TADR_GPIOH_BASE, 6}, /* D6 */
73 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOIEN, TADR_GPIOI_BASE, 3}, /* D7 */
74 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOIEN, TADR_GPIOI_BASE, 2}, /* D8 */
75 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOAEN, TADR_GPIOA_BASE, 15}, /* D9 */
76 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOIEN, TADR_GPIOI_BASE, 0}, /* D10 */
77 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOBEN, TADR_GPIOB_BASE, 15}, /* D11 */
78 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOBEN, TADR_GPIOB_BASE, 14}, /* D12 */
79 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOIEN, TADR_GPIOI_BASE, 1} /* D13 */
80#else /* TOPPERS_STM32F746_NUCLEO144 TOPPERS_STM32F767_NUCLEO144 */
81 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOGEN, TADR_GPIOG_BASE, 9}, /* D0 */
82 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOGEN, TADR_GPIOG_BASE, 14}, /* D1 */
83 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOFEN, TADR_GPIOF_BASE, 15}, /* D2 */
84 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOEEN, TADR_GPIOE_BASE, 13}, /* D3 */
85 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOFEN, TADR_GPIOF_BASE, 14}, /* D4 */
86 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOEEN, TADR_GPIOE_BASE, 11}, /* D5 */
87 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOEEN, TADR_GPIOE_BASE, 9}, /* D6 */
88 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOFEN, TADR_GPIOF_BASE, 13}, /* D7 */
89 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOFEN, TADR_GPIOF_BASE, 12}, /* D8 */
90 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIODEN, TADR_GPIOD_BASE, 15}, /* D9 */
91 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIODEN, TADR_GPIOD_BASE, 14}, /* D10 */
92 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOAEN, TADR_GPIOA_BASE, 7}, /* D11 */
93 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOAEN, TADR_GPIOA_BASE, 6}, /* D12 */
94 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOAEN, TADR_GPIOA_BASE, 5} /* D13 */
95#endif
96};
97
98#define NUM_DIGITAL_PORT (sizeof(Digital_Port)/sizeof(Arduino_PortControlBlock))
99
100static const Arduino_PortControlBlock Analog_Port[] = {
101#if defined(TOPPERS_STM32F7_DISCOVERY)
102 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOAEN, TADR_GPIOA_BASE, 0}, /* A0 */
103 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOFEN, TADR_GPIOF_BASE, 10}, /* A1 */
104 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOFEN, TADR_GPIOF_BASE, 9}, /* A2 */
105 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOFEN, TADR_GPIOF_BASE, 8}, /* A3 */
106 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOFEN, TADR_GPIOF_BASE, 7}, /* A4 */
107 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOFEN, TADR_GPIOF_BASE, 6} /* A5 */
108#else /* TOPPERS_STM32F746_NUCLEO144 TOPPERS_STM32F767_NUCLEO144 */
109 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOAEN, TADR_GPIOA_BASE, 3}, /* A0 */
110 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOCEN, TADR_GPIOC_BASE, 0}, /* A1 */
111 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOCEN, TADR_GPIOC_BASE, 3}, /* A2 */
112 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOFEN, TADR_GPIOF_BASE, 3}, /* A3 */
113 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOFEN, TADR_GPIOF_BASE, 5}, /* A4 */
114 { (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOFEN, TADR_GPIOF_BASE, 10} /* A5 */
115#endif
116};
117
118#define NUM_ANALOG_PORT (sizeof(Analog_Port)/sizeof(Arduino_PortControlBlock))
119
120void
121pinClock(uint8_t no)
122{
123 const Arduino_PortControlBlock *ppcb = &Digital_Port[no];
124
125 if(no >= NUM_DIGITAL_PORT)
126 return;
127 sil_orw_mem((uint32_t *)ppcb->gioclockbase, ppcb->gioclockbit);
128}
129
130void
131digitalWrite(uint8_t no, int sw)
132{
133 const Arduino_PortControlBlock *ppcb = &Digital_Port[no];
134
135 if(no >= NUM_DIGITAL_PORT)
136 return;
137 if(sw == 0)
138 sil_wrw_mem((uint32_t *)(ppcb->giobase+TOFF_GPIO_BSRR), (1<<(ppcb->giopin+16)));
139 else
140 sil_wrw_mem((uint32_t *)(ppcb->giobase+TOFF_GPIO_BSRR), (1<<(ppcb->giopin)));
141}
142
143int
144digitalRead(uint8_t no)
145{
146 const Arduino_PortControlBlock *ppcb = &Digital_Port[no];
147 int sw;
148
149 if(no >= NUM_DIGITAL_PORT)
150 return 0;
151 sw = sil_rew_mem((uint32_t *)(ppcb->giobase+TOFF_GPIO_IDR));
152 sw = (sw>>(ppcb->giopin)) & 1;
153 return sw;
154}
155
156Arduino_PortControlBlock*
157getGpioTable(uint8_t mode, uint8_t no)
158{
159 if(mode == ANALOG_PIN){
160 if(no >= NUM_ANALOG_PORT)
161 return NULL;
162 return (Arduino_PortControlBlock*)&Analog_Port[no];
163 }
164 else{
165 if(no >= NUM_DIGITAL_PORT)
166 return NULL;
167 return (Arduino_PortControlBlock*)&Digital_Port[no];
168 }
169}
170
171
Note: See TracBrowser for help on using the repository browser.