blob: 9971f3ff027bf1cb1f44099c48d973a31a8eee22 [file] [log] [blame]
rjw6c1fd8f2022-11-30 14:33:01 +08001/*****************************************************************************
2* Copyright Statement:
3* --------------------
4* This software is protected by Copyright and the information contained
5* herein is confidential. The software may not be copied and the information
6* contained herein may not be used or disclosed except with the written
7* permission of MediaTek Inc. (C) 2012
8*
9* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
10* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
11* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
12* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
13* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
14* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
15* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
16* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
17* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
18* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
19* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
20* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
21*
22* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
23* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
24* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
25* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
26* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
27*
28* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
29* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
30* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
31* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
32* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
33*
34*****************************************************************************/
35
36/*******************************************************************************
37 * Filename:
38 * ---------
39 * drv_gpio.c
40 *
41 * Project:
42 * --------
43 * TATAKA
44 *
45 * Description:
46 * ------------
47 * Low level GPIO driver
48 *
49 * Author:
50 * -------
51 * -------
52 *
53 * ==========================================================================
54 * $Log$
55 *
56 * 05 06 2022 yao.xue
57 * [MOLY00851720] [FM350][MIPI][IO_Driving][clock speed][zontn.wang]The MIPI IO Driving strength and clock speed setting
58 * modify GPIO IOCFG regbase.
59 *
60 * 11 16 2020 zhiqiang.yu
61 * [MOLY00595491] [Colgin]MD GPIO DRV Patchback From T700 Branch
62 *
63 * .
64 *
65 * 11 11 2020 zhiqiang.yu
66 * [MOLY00593568] [MT6877]Call For Check In MD GPIO Drv
67 *
68 * .
69 *
70 * 07 16 2020 zhiqiang.yu
71 * [MOLY00546611] [MT6833]Call For Check In MD GPIO Driver
72 *
73 * .
74 *
75 * 01 21 2020 zhiqiang.yu
76 * [MOLY00476172] [MT6853]Call For Check In GPIO Drv
77 *
78 * .
79 *
80 * 12 04 2019 zhiqiang.yu
81 * [MOLY00463572] [MMRF] Ddie driving customization development
82 *
83 * .GPIO DRIVER
84 *
85 * 09 24 2019 zhiqiang.yu
86 * [MOLY00443103] [MT6873]Check in md gpio driver
87 *
88 * .
89 *
90 * 06 18 2019 zhiqiang.yu
91 * [MOLY00413533] [MT6297]Fix GPIO Drv build Warning about LTO
92 *
93 * .
94 *
95 * 12 07 2018 zhiqiang.yu
96 * [MOLY00371362] [Pertus]check in gpio drv
97 *
98 * .fix build error
99 *
100 * 08 21 2018 zhiqiang.yu
101 * [MOLY00347417] [MT6297][VMOLY]check in md gpio&eint drv
102 *
103 * .fix build error
104 *
105 * 08 02 2018 zhiqiang.yu
106 * [MOLY00343825] [MT6779]Call For Check In,gpio driver
107 *
108 * .
109 *
110 * 04 03 2018 zhiqiang.yu
111 * remove ownership@6290.
112 *
113 * 12 18 2017 zhiqiang.yu
114 * [MOLY00296840] [EIGER]call for mt3967 gpio driver
115 *
116 * .
117 *
118 * 11 01 2017 zhiqiang.yu
119 * [MOLY00244517] [MT6295M]fix build error,for gpio driver.patch back from LR12A.MP2.MT6295M.DEV.
120 *
121 * 10 30 2017 zhiqiang.yu
122 * [MOLY00286048] [MT6765]check in gpio drv for MT6765.
123 *
124 * 08 24 2017 zhiqiang.yu
125 * [MOLY00273500] [MT6771]check in md gpio driver
126 *
127 * .
128 *
129 * 06 12 2017 zhiqiang.yu
130 * [MOLY00244007] [MT6739]check in gpio driver for zion
131 *
132 * .
133 *
134 * 11 16 2016 zhiqiang.yu
135 * [MOLY00213576] [MT6763]eint&gpio driver check in.
136 *
137 * 02 22 2016 zhiqiang.yu
138 * [MOLY00165689] Code Inspection and MSBB Scan
139 * Fix high impact defect.
140 *
141 * 08 04 2015 zhiqiang.yu
142 * [MOLY00135213] check in gpiodriver code for mt6797 project
143 * .
144 *
145 * 07 22 2015 zhiqiang.yu
146 * [MOLY00131033] enable sp set gpio mode funtion
147 * <saved by Perforce>
148 *
149 * 06 17 2015 zhiqiang.yu
150 * [MOLY00121904] checkin md eint code for mt6755
151 * .
152 *
153 * 06 16 2015 zhiqiang.yu
154 * [MOLY00121625] checkin md gpio code for mt6755
155 * .
156 *
157 * 06 30 2014 chuanbo.liao
158 * [MOLY00070787] [tk6291]fix 6291 build error
159 * [6291]modify the EINT/GPIO base address
160 *
161 * 05 10 2013 da.wang
162 * [MOLY00022149] [MT6290E1][TRUNK] Add GPIO driver API for Meta mode solution
163 * Upload GPIO driver API for meta mode.
164 *
165 * 02 04 2013 da.wang
166 * [MOLY00009904] [GPIO/EINT] Rename MT7280 to MT6290 on MOLY trunk
167 * .rename GPIO/EINT related keywords MT7208 to MT6290 in MOLY
168 ****************************************************************************/
169#include "drv_comm.h"
170#include "drv_gpio.h"
171#include "kal_general_types.h"
172#include "devdrv_ls.h"
173
174
175//========================================================================
176// Global variable
177//========================================================================
178
179#ifdef __CUST_NEW__
180 #if defined(DRV_GPIO_8_MODES) || defined(DRV_GPIO_MODE_4BITS)
181 extern const kal_uint32 gpio_mode_allowed[][8];
182 #else //defined(DRV_GPIO_8_MODES) || defined(DRV_GPIO_MODE_4BITS)
183extern const kal_uint32 gpio_mode_allowed[][4];
184 #endif //defined(DRV_GPIO_8_MODES) || defined(DRV_GPIO_MODE_4BITS)
185extern const kal_uint32 gpio_dir_out_allowed[];
186extern const kal_uint32 gpio_dir_in_allowed[];
187extern const kal_uint16 gpo_mode_allowed[];
188extern kal_uint32 gpio_check_for_write[];
189extern kal_uint32 gpio_check_for_read[];
190extern kal_uint16 gpo_check_for_write[];
191extern kal_bool gpio_debug_enable;
192#endif /* __CUST_NEW__ */
193
194#if 0
195/* under construction !*/
196/* under construction !*/
197/* under construction !*/
198/* under construction !*/
199/* under construction !*/
200/* under construction !*/
201/* under construction !*/
202/* under construction !*/
203/* under construction !*/
204/* under construction !*/
205/* under construction !*/
206/* under construction !*/
207/* under construction !*/
208/* under construction !*/
209/* under construction !*/
210/* under construction !*/
211/* under construction !*/
212/* under construction !*/
213/* under construction !*/
214/* under construction !*/
215/* under construction !*/
216/* under construction !*/
217#endif
218
219//========================================================================
220/**
221 * @brief get direction register value of pin
222 * @param gpio_pin : The GPIO pin to be read.
223 * @return return the direction register value of gpio_pin
224 * 0: the direction of gpio is input
225 * 1: the direction of gpio is output
226 * GPIO_FAIL: gpio_pin is out of range
227 */
228kal_int32 gpio_get_dir_value (gpio_pin_e gpio_pin)
229{
230#if defined(MT6763)||defined(MT6739)||defined(MT6771)|| defined(MT6765)|| defined(MT6295M)|| defined(MT3967)|| defined(MT6779)||defined(MT6297)||defined(MT6885)||defined(MERCURY)||defined(MT6873)||defined(MT6853)||defined(MT6833)||defined(MT6877)||defined(CHIP10992)
231 unsigned long pos;
232 unsigned long bit;
233 unsigned long data;
234
235 if (gpio_pin>GPIO_PIN_MAX)
236 {
237 GPIO_ERR("The gpio pin is out of range of MAX num (%d) !!!!", GPIO_PIN_MAX);
238 return GPIO_FAIL;
239 }
240
241 pos = gpio_pin/32;
242 bit = gpio_pin%32;
243
244 data = DRV_Reg32((GPIO_DIR1 + pos*0x10));
245
246 return ((data&(1<<bit))?1:0);
247
248#endif
249}
250
251// ----------------------------------------------------------
252/**
253 * @brief Set GPIO_DIR input or output
254 * @param gpio_pin : The GPIO pin to be set.
255 * @param direction : The direction to be set in gpio_pin.
256 * 1: set as output pin
257 * 0: set as input pin
258 * @return GPIO_OK : set successful, GPIO_FAIL : set failed
259 */
260static kal_int32 _GPIO_Set_Direction(gpio_pin_e gpio_pin, kal_uint32 direction)
261{
262#if defined(MT6763)||defined(MT6739)||defined(MT6771)|| defined(MT6765)|| defined(MT6295M)|| defined(MT3967)|| defined(MT6779)||defined(MT6297)||defined(MT6885)||defined(MERCURY)||defined(MT6873)||defined(MT6853)||defined(MT6833)||defined(MT6877)||defined(CHIP10992)
263 unsigned long pos;
264 unsigned long bit;
265 //unsigned long data;
266
267 if (gpio_pin>GPIO_PIN_MAX)
268 {
269 GPIO_ERR("The gpio pin is out of range of MAX num (%d) !!!!", GPIO_PIN_MAX);
270 return GPIO_FAIL;
271 }
272
273 pos = gpio_pin/32;
274 bit = gpio_pin%32;
275 if (direction == GPIO_AS_OUTPUT)
276 DRV_WriteReg32(GPIO_DIR_SET(pos),1<<bit);
277 else
278 DRV_WriteReg32(GPIO_DIR_CLR(pos),1<<bit);
279
280 return GPIO_OK;
281
282#endif
283}
284
285
286
287//========================================================================
288/*-----------------------------------------------------------------------*
289* @brief Read the input value of the gpio pin.
290* @param gpio_pin : The pin which to read value.
291* @param *value : The variable to save value read from the pin, will be 0 or 1.
292* @return GPIO_OK : get successful, GPIO_FAIL : get failed
293*-----------------------------------------------------------------------*/
294kal_int32 GPIO_READ_INPUT_VALUE (gpio_pin_e gpio_pin, kal_uint32 *value)
295{
296#if defined(MT6763)||defined(MT6739)||defined(MT6771)|| defined(MT6765)|| defined(MT6295M)|| defined(MT3967)|| defined(MT6779)||defined(MT6297)||defined(MT6885)||defined(MERCURY)||defined(MT6873)||defined(MT6853)||defined(MT6833)||defined(MT6877)||defined(CHIP10992)
297 unsigned long pos;
298 unsigned long bit;
299 unsigned long data;
300
301 if (gpio_pin>GPIO_PIN_MAX)
302 {
303 GPIO_ERR("The gpio pin is out of range of MAX num (%d) !!!!", GPIO_PIN_MAX);
304 return GPIO_FAIL;
305 }
306
307 pos = gpio_pin/32;
308 bit = gpio_pin%32;
309 data = DRV_Reg32((GPIO_DIN1 + pos*0x10));
310 *value=((data&(1<<bit))?1:0);
311
312 return GPIO_OK;
313
314#endif
315}
316
317
318
319
320// ----------------------------------------------------------
321/**
322 * @brief Enable or Disable GPIO_PULLEN specific pin
323 * @param gpio_pin : The GPIO pin to be set.
324 * @param pullen : set 1 to enable pull up/down in gpio_pin.
325 * @return GPIO_OK : set successful, GPIO_FAIL : set failed
326 */
327kal_int32 _GPIO_Set_Pullen(gpio_pin_e gpio_pin, kal_uint32 pullen)
328{
329#if defined(MT6763)||defined(MT6739)||defined(MT6771)|| defined(MT6765)|| defined(MT6295M)|| defined(MT3967)|| defined(MT6779)||defined(MT6297)||defined(MT6885)||defined(MERCURY)||defined(MT6873)||defined(MT6853)||defined(MT6833)||defined(MT6877)||defined(CHIP10992)
330 return GPIO_FAIL;
331#else
332 return GPIO_FAIL;
333#endif
334}
335
336// ----------------------------------------------------------
337/**
338 * @brief Set GPIO_PULLSEL to pull-up or pull-down
339 * @param gpio_pin : The GPIO pin to be set.
340 * @param updown : set GPIO_PULL_UP to set gpio_pin in pull-up. set GPIO_PULL_DOWN to set gpio_pin pull_down.
341 * @return GPIO_OK : set successful, GPIO_FAIL : set failed
342 */
343kal_int32 _GPIO_Set_Pullsel(gpio_pin_e gpio_pin, kal_uint32 updown)
344{
345#if defined(MT6763)||defined(MT6739)||defined(MT6771)|| defined(MT6765)|| defined(MT6295M)|| defined(MT3967)|| defined(MT6779)||defined(MT6297)||defined(MT6885)||defined(MERCURY)||defined(MT6873)||defined(MT6853)||defined(MT6833)||defined(MT6877)||defined(CHIP10992)
346 return GPIO_FAIL;
347#else
348 return GPIO_FAIL;
349#endif
350}
351
352
353/**
354* @brief Set pin direction as an output pin.
355* @param gpio_pin : The pin which to be set direction to output pin.
356* @return GPIO_OK : set successful, GPIO_FAIL : set failed
357*/
358kal_int32 GPIO_SET_DIRECT_OUTPUT (gpio_pin_e gpio_pin)
359{
360 if (gpio_pin>GPIO_PIN_MAX)
361 {
362 GPIO_ERR("The gpio pin is out of range of MAX num (%d) !!!!", GPIO_PIN_MAX);
363 return GPIO_FAIL;
364 }
365
366 if (GPIO_FAIL == _GPIO_Set_Pullen(gpio_pin, GPIO_DISABLE) )
367 { return GPIO_FAIL; }
368
369 if (GPIO_FAIL == _GPIO_Set_Direction(gpio_pin, GPIO_AS_OUTPUT) )
370 { return GPIO_FAIL; }
371
372 return GPIO_OK;
373}
374
375//========================================================================
376/**
377* @brief Set pin direction as an input pin.
378* @param gpio_pin : The pin which want to be set.
379* @param pull_en : GPIO_ENABLE or GPIO_DISABLE, Set if pull-up/down function is enable.
380* @param pull_updown : GPIO_PULL_UP / GPIO_PULL_DOWN, it works only when pull_en is enable.
381* @return GPIO_OK : set successful, GPIO_FAIL : set failed
382*/
383kal_int32 GPIO_SET_DIRECT_INPUT (gpio_pin_e gpio_pin, kal_uint32 pull_en, kal_uint32 pull_updown)
384{
385 if (gpio_pin>GPIO_PIN_MAX)
386 {
387 GPIO_ERR("The gpio pin is out of range of MAX num (%d) !!!!", GPIO_PIN_MAX);
388 return GPIO_FAIL;
389 }
390 /* Step-1 Check GPIO_Mode to make sure the pin can be uesed as GPIO*/
391 //_GPIO_ShareMode_Chk(gpio_pin);
392
393 /* Step-2 set the pull-up/down */
394 // When input, the pullen could be set as required
395 // If the pullen is set, the pullsel should be set.
396 if (GPIO_FAIL == _GPIO_Set_Pullen(gpio_pin, pull_en) )
397 { return GPIO_FAIL; }
398
399 /* Step-3 set the pull-up/down when gpio is input*/
400 if (GPIO_FAIL == _GPIO_Set_Pullsel(gpio_pin, pull_updown) )
401 { return GPIO_FAIL; }
402
403 /* Step-4 set the direction to input*/
404 if (GPIO_FAIL == _GPIO_Set_Direction(gpio_pin, GPIO_AS_INPUT) )
405 { return GPIO_FAIL; }
406
407
408 return GPIO_OK;
409}
410
411
412//========================================================================
413/**
414* @brief set the data inversion parameter of the gpio pin.
415* @param gpio_pin : The pin which is to be set data inversion.
416* @param inversion: The value to be set, will be 0 or 1.
417* 0: disable data inversion
418 1: enable data inversion
419* @return GPIO_OK : set successful, GPIO_FAIL : set failed
420*/
421kal_int32 gpio_set_data_inversion(gpio_pin_e gpio_pin, kal_uint32 inversion)
422{
423#if defined(MT6763)||defined(MT6739)||defined(MT6771)|| defined(MT6765)|| defined(MT6295M)|| defined(MT3967)|| defined(MT6779)||defined(MT6297)||defined(MT6885)||defined(MERCURY)||defined(MT6873)||defined(MT6853)||defined(MT6833)||defined(MT6877)||defined(CHIP10992)
424 return GPIO_FAIL;
425#else
426 return GPIO_FAIL;
427#endif
428}
429
430
431
432//========================================================================
433/**
434* @brief Write the output value of the gpio pin. It only work when the pin is an output pin.
435* @param gpio_pin : The pin which to be set output value.
436* @param value : The value which want to be set, can be 0 or 1.
437* @return GPIO_OK : set successful, GPIO_FAIL : set failed
438*/
439kal_int32 GPIO_WRITE_OUTPUT_VALUE (gpio_pin_e gpio_pin, kal_uint32 value)
440{
441#if defined(MT6763)||defined(MT6739)||defined(MT6771)|| defined(MT6765)|| defined(MT6295M)|| defined(MT3967)|| defined(MT6779)||defined(MT6297)||defined(MT6885)||defined(MERCURY)||defined(MT6873)||defined(MT6853)||defined(MT6833)||defined(MT6877)||defined(CHIP10992)
442 unsigned long pos;
443 unsigned long bit;
444 //unsigned long data;
445
446 if (gpio_pin>GPIO_PIN_MAX)
447 {
448 GPIO_ERR("The gpio pin is out of range of MAX num (%d) !!!!", GPIO_PIN_MAX);
449 return GPIO_FAIL;
450 }
451
452 pos = gpio_pin/32;
453 bit = gpio_pin%32;
454 if (value == GPIO_OUTPUT_HIGH)
455 DRV_WriteReg32(GPIO_DOUT_SET(pos),1<<bit);
456 else
457 DRV_WriteReg32(GPIO_DOUT_CLR(pos),1<<bit);
458
459 return GPIO_OK;
460#endif
461}
462
463
464/*-----------------------------------------------------------------------*
465* FUNCTION
466* GPIO_ReadIO
467*
468* DESCRIPTION
469* This function is to read data from one GPIO pin
470*
471* CALLS
472* Read data from one GPIO pin
473*
474* PARAMETERS
475* port: pin number
476*
477* RETURNS
478* 1 or 0
479*
480* GLOBALS AFFECTED
481* external_global
482*-----------------------------------------------------------------------*/
483char GPIO_ReadIO(kal_int16 port)
484{
485#if defined(MT6763)||defined(MT6739)||defined(MT6771)|| defined(MT6765)|| defined(MT6295M)|| defined(MT3967)|| defined(MT6779)||defined(MT6297)||defined(MT6885)||defined(MERCURY)||defined(MT6873)||defined(MT6853)||defined(MT6833)||defined(MT6877)||defined(CHIP10992)
486 kal_uint32 input_val = 0;
487 if(GPIO_READ_INPUT_VALUE((gpio_pin_e)port, &input_val) != GPIO_OK)
488 {
489 GPIO_ERR("\tGPIO_ReadIO: read the value of port[%d] failed!! ",port);
490 }
491 return (char)input_val;
492#endif
493}
494
495
496/*
497* FUNCTION
498* GPIO_WriteIO
499*
500* DESCRIPTION
501* This function is to write data to one GPIO port
502*
503* CALLS
504* Write data to one GPIO port
505*
506* PARAMETERS
507* data: KAL_TRUE(1) or KAL_FALSE(0)
508* port: gpio pin number
509*
510* RETURNS
511* None
512*
513* GLOBALS AFFECTED
514* external_global
515*/
516void GPIO_WriteIO(char data, kal_int16 port)
517{
518#if defined(MT6763)||defined(MT6739)||defined(MT6771)|| defined(MT6765)|| defined(MT6295M)|| defined(MT3967)|| defined(MT6779)||defined(MT6297)||defined(MT6885)||defined(MERCURY)||defined(MT6873)||defined(MT6853)||defined(MT6833)||defined(MT6877)||defined(CHIP10992)
519 GPIO_WRITE_OUTPUT_VALUE((gpio_pin_e)port,data);
520#endif
521}
522#if defined(MT6763)||defined(MT6739)||defined(MT6771)|| defined(MT6765)|| defined(MT6295M)|| defined(MT3967)|| defined(MT6779)||defined(MT6297)||defined(MT6885)||defined(MERCURY)||defined(MT6873)||defined(MT6853)||defined(MT6833)||defined(MT6877)||defined(CHIP10992)
523#define MAX_GPIO_MODE_PER_REG 8
524#define GPIO_MODE_BITS 4
525#endif
526void GPIO_ModeSetup(kal_uint16 pin, kal_uint16 conf_data)
527{
528#if defined(MT6763)||defined(MT6739)||defined(MT6771)|| defined(MT6765)|| defined(MT6295M)|| defined(MT3967)|| defined(MT6779)||defined(MT6297)||defined(MT6885)||defined(MERCURY)||defined(MT6873)||defined(MT6853)||defined(MT6833)||defined(MT6877)||defined(CHIP10992)
529#if defined(__FPGA__) && defined(MT6295M)
530
531#else
532 unsigned long pos;
533 unsigned long bit;
534 unsigned long data;
535 unsigned long mask = (1L << GPIO_MODE_BITS)-1;
536 unsigned long offset;
537
538 pos = pin/MAX_GPIO_MODE_PER_REG;
539 bit = pin%MAX_GPIO_MODE_PER_REG;
540
541 offset = GPIO_MODE_BITS*bit;
542
543 data = DRV_Reg32(GPIO_MODE(pos));
544 data &= ~(mask << offset);
545 data |= (conf_data << offset);
546 //to avoid possible race condition with AP,use SET/CLR reg to setup MODE register
547 DRV_WriteReg32(GPIO_MODE_CLR(pos),(mask << (GPIO_MODE_BITS*bit)));
548 DRV_WriteReg32(GPIO_MODE_SET(pos),data);
549#endif
550#endif
551}
552
553/*
554* FUNCTION
555* GPIO_InitIO
556*
557* DESCRIPTION
558* This function is to initialize one GPIO pin as INPUT or OUTPUT
559*
560* CALLS
561* Initialize one GPIO pin as INPUT or OUTPUT
562*
563* PARAMETERS
564* direction: INPUT or OUTPUT
565* port: pin number
566*
567* RETURNS
568* None
569*
570* GLOBALS AFFECTED
571* external_global
572*/
573void GPIO_InitIO(char direction, kal_int16 port)
574{
575#if defined(MT6763)||defined(MT6739)||defined(MT6771)|| defined(MT6765)|| defined(MT6295M)|| defined(MT3967)|| defined(MT6779)||defined(MT6297)||defined(MT6885)||defined(MERCURY)||defined(MT6873)||defined(MT6853)||defined(MT6833)||defined(MT6877)||defined(CHIP10992)
576 if(GPIO_OUTPUT == direction)
577 {
578 _GPIO_Set_Direction((gpio_pin_e)port,GPIO_OUTPUT);
579 }
580 else
581 {
582 _GPIO_Set_Direction((gpio_pin_e)port,GPIO_INPUT);
583 }
584
585#endif
586}
587
588char GPIO_ReturnMode(kal_int16 port)
589{
590#if defined(MT6763)||defined(MT6739)||defined(MT6771)|| defined(MT6765)|| defined(MT6295M)|| defined(MT3967)|| defined(MT6779)||defined(MT6297)||defined(MT6885)||defined(MERCURY)||defined(MT6873)||defined(MT6853)||defined(MT6833)||defined(MT6877)||defined(CHIP10992)
591#if defined(__FPGA__) && defined(MT6295M)
592 return GPIO_FAIL;
593#else
594 unsigned long pos;
595 unsigned long bit;
596 unsigned long data;
597 unsigned long mask = (1L << GPIO_MODE_BITS)-1;
598 unsigned long offset;
599
600 pos = port/MAX_GPIO_MODE_PER_REG;
601 bit = port%MAX_GPIO_MODE_PER_REG;
602
603 offset = GPIO_MODE_BITS*bit;
604
605 data = DRV_Reg32(GPIO_MODE(pos));
606 data = (data >> offset)&mask;
607 return (char)data;
608#endif
609#else
610 return GPIO_FAIL;
611#endif
612}
613
614/*
615* FUNCTION
616* GPIO_ReturnDir
617*
618* DESCRIPTION
619* This function is to report GPIO direction value
620*
621* CALLS
622* Report GPIO direction value accoding to input pin
623*
624* PARAMETERS
625* GPIO pin
626*
627* RETURNS
628* GPIO direction value
629*
630* GLOBALS AFFECTED
631* external_global
632*/
633char GPIO_ReturnDir(kal_int16 port)
634{
635#if defined(MT6763)||defined(MT6739)||defined(MT6771)|| defined(MT6765)|| defined(MT6295M)|| defined(MT3967)|| defined(MT6779)||defined(MT6297)||defined(MT6885)||defined(MERCURY)||defined(MT6873)||defined(MT6853)||defined(MT6833)||defined(MT6877)||defined(CHIP10992)
636 return gpio_get_dir_value(port);
637#endif
638}
639
640/*
641* FUNCTION
642* GPIO_ReturnDout
643*
644* DESCRIPTION
645* This function is to report GPIO output value
646*
647* CALLS
648* Report GPIO output value accoding to input pin
649*
650* PARAMETERS
651* GPIO pin
652*
653* RETURNS
654* GPIO output value
655*
656* GLOBALS AFFECTED
657* external_global
658*/
659char GPIO_ReturnDout(kal_int16 port)
660{
661#if defined(MT6763)||defined(MT6739)||defined(MT6771)|| defined(MT6765)|| defined(MT6295M)|| defined(MT3967)|| defined(MT6779)||defined(MT6297)||defined(MT6885)||defined(MERCURY)||defined(MT6873)||defined(MT6853)||defined(MT6833)||defined(MT6877)||defined(CHIP10992)
662 return GPIO_FAIL;
663#endif
664}
665
666
667/*
668* FUNCTION
669* GPIO_PullenSetup
670*
671* DESCRIPTION
672* This function is to enable or disable the pull up/down of the related GPIO pin.
673* You can not decide to pull up or down, it is set inside the chip.
674* And, the setting is different from pin by pin.
675*
676* PARAMETERS
677* pin : gpio pin number range from 0~63
678* enable: enable the pull up/down
679*
680* RETURNS
681* None
682*
683* GLOBALS AFFECTED
684*
685*/
686void GPIO_PullenSetup(kal_uint16 pin, kal_bool enable)
687{
688 #ifdef __CUST_NEW__
689 pin &= (~GPIO_MAGIC_NUM);
690 #endif
691 _GPIO_Set_Pullen(pin,enable);
692}
693
694/*
695* FUNCTION
696* GPIO_PullSelSetup
697*
698* DESCRIPTION
699* This function is to select pull up/down of the related GPIO pin.
700*
701* PARAMETERS
702* pin : gpio pin number range from 0~63
703* enable: enable the pull up/down
704*
705* RETURNS
706* None
707*
708* GLOBALS AFFECTED
709*
710*/
711void GPIO_PullSelSetup(kal_uint16 pin, kal_bool pull_up)
712{
713 #ifdef __CUST_NEW__
714 pin &= (~GPIO_MAGIC_NUM);
715 #endif
716 _GPIO_Set_Pullsel(pin,pull_up);
717}
718
719/*
720* FUNCTION
721* GPIO_DinvSetup
722*
723* DESCRIPTION
724* This function is to enable data invert of the related GPIO pin
725*
726* PARAMETERS
727* pin : gpio pin number range from 0~63
728* enable: enable the data inversion
729*
730* RETURNS
731* None
732*
733* GLOBALS AFFECTED
734*
735*/
736void GPIO_DinvSetup(kal_uint16 pin, kal_bool enable)
737{
738 #ifdef __CUST_NEW__
739 pin &= (~GPIO_MAGIC_NUM);
740 #endif
741 gpio_set_data_inversion(pin,enable);
742}
743
744/*
745* FUNCTION
746* GPIO_SetDebugMode
747*
748* DESCRIPTION
749* This function is to set GPIO HW debug mode
750* currently MT6290 not support this function
751*
752* CALLS
753* set GPIO HW debug mode
754*
755* PARAMETERS
756* enable - KAL_TRUE: turn on the debug mode
757* KAL_FALSE: turn off the debug mode
758*
759* RETURNS
760* None
761*
762* GLOBALS AFFECTED
763* external_global
764*/
765void GPIO_SetDebugMode(kal_bool enable)
766{
767 //not support in MT6290
768}
769
770#ifdef __CUST_NEW__
771
772/*
773* FUNCTION
774* GPIO_InitIO_FAST
775*
776* DESCRIPTION
777* This function is to initialize one GPIO pin as INPUT or OUTPUT.
778* Note that it's for fast access without debug checking and only exists
779* when __CUST_NEW__ is defined.
780*
781* CALLS
782* Initialize one GPIO pin as INPUT or OUTPUT
783*
784* PARAMETERS
785* direction: INPUT or OUTPUT
786* port: pin number
787*
788* RETURNS
789* None
790*
791* GLOBALS AFFECTED
792* external_global
793*/
794void GPIO_InitIO_FAST(char direction, kal_int16 port)
795{
796 #ifdef __GPIO_FAST_DEBUB__
797 if (gpio_debug_enable == KAL_TRUE)
798 {
799 if (direction == 0)
800 {
801 #ifdef __GPIO_CHECK_WARNING__
802 if (!kal_if_lisr()) {
803 if (!((gpio_dir_in_allowed[(kal_uint8)port>>5]) & (1 << (port & 0x1f))))
804 {
805 kal_int32 ret;
806 system_print("GPIO WARNING!! GPIO_InitIO_FAST: Direction Input is not allowed!");
807 ret = sprintf(buff, "pin=%d", port);
808 system_print(buff);
809 }
810 }
811 #elif defined(__GPIO_CHECK_ASSERT__)
812 ASSERT((gpio_dir_in_allowed[(kal_uint8)port>>5]) & (1 << (port & 0x1f)));
813 #endif /* __GPIO_CHECK_WARNING__ */
814 }
815 else
816 {
817 #ifdef __GPIO_CHECK_WARNING__
818 if (!kal_if_lisr()) {
819 if (!((gpio_dir_out_allowed[(kal_uint8)port>>5]) & (1 << (port & 0x1f))))
820 {
821 kal_int32 ret;
822 system_print("GPIO WARNING!! GPIO_InitIO_FAST: Direction Output is not allowed!");
823 ret = sprintf(buff, "pin=%d", port);
824 system_print(buff);
825 }
826 }
827 #elif defined(__GPIO_CHECK_ASSERT__)
828 ASSERT((gpio_dir_out_allowed[(kal_uint8)port>>5]) & (1 << (port & 0x1f)));
829 #endif /* __GPIO_CHECK_WARNING__ */
830 }
831 gpio_check_for_write[(kal_uint8)port>>5] |= (1 << (port & 0x1f));
832 gpio_check_for_read[(kal_uint8)port>>5] |= (1 << (port & 0x1f));
833 }
834 #endif /* __GPIO_FAST_DEBUB__ */
835
836 #ifdef __CUST_NEW__
837 port &= (~GPIO_MAGIC_NUM);
838 #endif /* __CUST_NEW__ */
839 if(GPIO_OUTPUT == direction)
840 {
841 GPIO_SET_DIRECT_OUTPUT((gpio_pin_e)port);
842 }
843 else
844 {
845 _GPIO_Set_Direction((gpio_pin_e)port,GPIO_INPUT);
846 }
847}
848
849/*
850* FUNCTION
851* GPIO_WriteIO_FAST
852*
853* DESCRIPTION
854* This function is to write data to one GPIO port
855* Note that it's for fast access without debug checking and only exists
856* when __CUST_NEW__ is defined.
857*
858* CALLS
859* Write data to one GPIO port
860*
861* PARAMETERS
862* data: KAL_TRUE(1) or KAL_FALSE(0)
863* port: gpio pin number
864*
865* RETURNS
866* None
867*
868* GLOBALS AFFECTED
869* external_global
870*/
871void GPIO_WriteIO_FAST(char data, kal_int16 port)
872{
873 #ifdef __GPIO_FAST_DEBUB__
874 if ((gpio_debug_enable == KAL_TRUE) &&
875 (gpio_check_for_write[(kal_uint8)port>>5] & (1 << (port & 0x1f))))
876 {
877
878 #ifdef __GPIO_CHECK_WARNING__
879 if (!kal_if_lisr()) {
880 kal_uint16 mode;
881 mode = GPIO_ReturnMode(port);
882 if (mode != 0)
883 {
884 kal_int32 ret;
885 system_print("GPIO WARNING!! GPIO_WriteIO_FAST: mode is not correct.");
886 ret = sprintf(buff, "pin=%d, mode=%d", port, mode);
887 system_print(buff);
888 }
889 #elif defined(__GPIO_CHECK_ASSERT__)
890 ASSERT(GPIO_ReturnMode(port) == 0);
891 #endif /* __GPIO_CHECK_WARNING__ */
892 }
893 #ifdef __GPIO_CHECK_WARNING__
894 if (!kal_if_lisr()) {
895 char dir;
896 dir = GPIO_ReturnDir(port);
897 if (dir != 1)
898 {
899 kal_int32 ret;
900 system_print("GPIO WARNING!! GPIO_WriteIO_FAST: direction is not correct.");
901 ret = sprintf(buff, "pin=%d, direction=%d", port, dir);
902 system_print(buff);
903 }
904 }
905 #elif defined(__GPIO_CHECK_ASSERT__)
906 ASSERT(GPIO_ReturnDir(port) == 1);
907 #endif /* __GPIO_CHECK_WARNING__ */
908 gpio_check_for_write[(kal_uint8)port>>5] &= (~(1 << (port & 0x1f)));
909 }
910 #endif /* __GPIO_FAST_DEBUB__ */
911
912 #ifdef __CUST_NEW__
913 port &= (~GPIO_MAGIC_NUM);
914 #endif
915 GPIO_WRITE_OUTPUT_VALUE((gpio_pin_e)port,data);
916
917}
918
919/*
920* FUNCTION
921* GPIO_ReadIO_FAST
922*
923* DESCRIPTION
924* This function is to read data from one GPIO pin.
925* Note that it's for fast access without debug checking and only exists
926* when __CUST_NEW__ is defined.
927*
928* CALLS
929* Read data from one GPIO pin
930*
931* PARAMETERS
932* port: pin number
933*
934* RETURNS
935* 1 or 0
936*
937* GLOBALS AFFECTED
938* external_global
939*/
940char GPIO_ReadIO_FAST(kal_int16 port)
941{
942 kal_uint32 input_val;
943
944 #ifdef __GPIO_FAST_DEBUB__
945 if ((gpio_debug_enable == KAL_TRUE) &&
946 (gpio_check_for_read[(kal_uint8)port>>5] & (1 << (port & 0x1f))))
947 {
948 #ifdef __GPIO_CHECK_WARNING__
949 if (!kal_if_lisr()) {
950 kal_uint16 mode;
951 char dir;
952 mode = GPIO_ReturnMode(port);
953 dir = GPIO_ReturnDir(port);
954 if ((mode != 0) || (dir != 0))
955 {
956 kal_int32 ret;
957 system_print("GPIO WARNING!! GPIO_ReadIO_FAST: mode or direction is not correct.");
958 ret = sprintf(buff, "pin=%d, mode=%d, direction=%d", port, mode, dir);
959 system_print(buff);
960 }
961 }
962 #elif defined(__GPIO_CHECK_ASSERT__)
963 ASSERT(GPIO_ReturnMode(port) == 0);
964 ASSERT(GPIO_ReturnDir(port) == 0);
965 #endif /* __GPIO_CHECK_WARNING__ */
966 gpio_check_for_read[(kal_uint8)port>>5] &= (~(1 << (port & 0x1f)));
967 }
968 #endif /* __GPIO_FAST_DEBUB__ */
969
970 #ifdef __CUST_NEW__
971 port &= (~GPIO_MAGIC_NUM);
972 #endif /* __CUST_NEW__ */
973
974 if(GPIO_READ_INPUT_VALUE((gpio_pin_e)port, &input_val) != GPIO_OK)
975 {
976 GPIO_ERR("\tGPIO_ReadIO: read the value of port[%d] failed!! ",port);
977 }
978 return (char)input_val;
979}
980
981
982#endif
983
984//#pragma arm section code = "INTERNCODE"
985/*
986* FUNCTION
987* GPIO_WriteIO_FAST2
988*
989* DESCRIPTION
990* This function is to write data to one GPIO port
991* Note that it's for faster access without debug checking.
992*
993* CALLS
994* Write data to one GPIO port
995*
996* PARAMETERS
997* data: KAL_TRUE(1) or KAL_FALSE(0)
998* no: no = port/16; port: GPIO port number
999* remainder_shift: remainder_shift = 1<<(port%16);
1000*
1001* RETURNS
1002* None
1003*
1004* GLOBALS AFFECTED
1005* external_global
1006*/
1007void DEVDRV_LS_INTERNCODE GPIO_WriteIO_FAST2(char data, kal_uint16 no, kal_uint16 remainder_shift)
1008{
1009 kal_uint32 gpio_pin,shift_bit;
1010
1011 #if defined(__CUST_NEW__)&&defined(__GPIO_FAST_DEBUB__)
1012 if ((gpio_debug_enable == KAL_TRUE) &&
1013 (gpio_check_for_write[(kal_uint8)port>>5] & (1 << (port & 0x1f))))
1014 {
1015 kal_int16 port;
1016 kal_uint16 index;
1017
1018 for (index = 0; index < 16; index++)
1019 {
1020 if (remainder_shift & (1 << index))
1021 break;
1022 }
1023 port = (kal_int16)((no<<4)+(index&0x000f));
1024
1025 #ifdef __GPIO_CHECK_WARNING__
1026 if (!kal_if_lisr()) {
1027 kal_uint16 mode;
1028 mode = GPIO_ReturnMode(port);
1029 if (mode != 0)
1030 {
1031 kal_int32 ret;
1032 system_print("GPIO WARNING!! GPIO_WriteIO_FAST: mode is not correct.");
1033 ret = sprintf(buff, "pin=%d, mode=%d", port, mode);
1034 system_print(buff);
1035 }
1036
1037 #elif defined(__GPIO_CHECK_ASSERT__)
1038 ASSERT(GPIO_ReturnMode(port) == 0);
1039 #endif /* __GPIO_CHECK_WARNING__ */
1040 }
1041 #ifdef __GPIO_CHECK_WARNING__
1042 if (!kal_if_lisr()) {
1043 char dir;
1044 dir = GPIO_ReturnDir(port);
1045 if (dir != 1)
1046 {
1047 kal_int32 ret;
1048 system_print("GPIO WARNING!! GPIO_WriteIO_FAST: direction is not correct.");
1049 ret = sprintf(buff, "pin=%d, direction=%d", port, dir);
1050 system_print(buff);
1051 }
1052 }
1053 #elif defined(__GPIO_CHECK_ASSERT__)
1054 ASSERT(GPIO_ReturnDir(port) == 1);
1055 #endif /* __GPIO_CHECK_WARNING__ */
1056 gpio_check_for_write[(kal_uint8)port>>5] &= (~(1 << (port & 0x1f)));
1057 }
1058 #endif /* __GPIO_FAST_DEBUB__ */
1059
1060 for (shift_bit = 0; shift_bit < 16; shift_bit++)
1061 {
1062 if (remainder_shift & (1 << shift_bit))
1063 break;
1064 }
1065 gpio_pin = (kal_int16)((no<<4)+(shift_bit&0x000f));
1066
1067 GPIO_WRITE_OUTPUT_VALUE((gpio_pin_e)gpio_pin,data);
1068
1069}
1070
1071//#pragma arm section code
1072
1073
1074/*conf_data = 0~3*/
1075void GPO_ModeSetup(kal_uint16 pin, kal_uint16 conf_dada)
1076{
1077 //not support in MT6290
1078}
1079
1080
1081/*
1082* FUNCTION
1083* GPI_O_WriteIO
1084*
1085* DESCRIPTION
1086* This function is to write data to one GPO pin
1087*
1088* CALLS
1089* Write data to one GPO pin
1090*
1091* PARAMETERS
1092* data: KAL_TRUE(1) or KAL_FALSE(0)
1093* port: gpo pin number
1094*
1095* RETURNS
1096* None
1097*
1098* GLOBALS AFFECTED
1099* external_global
1100*/
1101
1102void GPO_WriteIO(char data,kal_int16 port)
1103{
1104 //not support in MT6290
1105}
1106
1107/*
1108* FUNCTION
1109* GPO_ReturnDout
1110*
1111* DESCRIPTION
1112* This function is to report GPO output value
1113*
1114* CALLS
1115* Report GPO output value accoding to input pin
1116*
1117* PARAMETERS
1118* GPO pin
1119*
1120* RETURNS
1121* GPO output value
1122*
1123* GLOBALS AFFECTED
1124* external_global
1125*/
1126char GPO_ReturnDout(kal_int16 port)
1127{
1128 return 0;
1129}
1130
1131
1132/*
1133* FUNCTION
1134* GPO_ReturnMode
1135*
1136* DESCRIPTION
1137* This function is to report GPO mode value
1138*
1139* CALLS
1140* Report GPO mode value accoding to input pin
1141*
1142* PARAMETERS
1143* GPO pin
1144*
1145* RETURNS
1146* GPO mode value
1147*
1148* GLOBALS AFFECTED
1149* external_global
1150*/
1151char GPO_ReturnMode(kal_int16 port)
1152{
1153 return 0;
1154}
1155
1156
1157/**
1158* @brief set gpio ownership register
1159* @param pin_num : the gpio pin to set ownerhsip
1160* @param ownership : the ownership register bit value to set ,it should be 0~1
1161* 0: set ownership to MD
1162* 1: set ownership to AP
1163* @return GPIO_OK : set successful, GPIO_FAIL : set failed
1164*/
1165kal_int32 gpio_set_ownership(kal_uint32 pin_num,kal_uint32 ownership)
1166{
1167 return GPIO_FAIL;
1168}
1169#if defined(MT6885)
1170#define DRIVING_SETTING_GPIO_NUM 8
1171#define DRIVING_GEAR_NUM 2
1172const gpio_driving_gear_t gpio_driving_gear[DRIVING_GEAR_NUM]=
1173{
1174 {
1175 0x07,
1176 0x08,
1177 {
1178 {0x00,2},
1179 {0x01,4},
1180 {0x02,6},
1181 {0x03,8},
1182 {0x04,10},
1183 {0x05,12},
1184 {0x06,14},
1185 {0x07,16}
1186 }
1187 },
1188};
1189
1190const drv_gpio_driving_priv_t drv_gpio_driving_priv[DRIVING_SETTING_GPIO_NUM]=
1191{
1192 {1,57,0, 6, 0xC1E20000},
1193 {1,58,0, 9, 0xC1E20000},
1194 {1,59,0,12, 0xC1E20000},
1195 {1,60,0,15, 0xC1E20000},
1196 {1,85,0,12, 0xC1E70000},
1197 {1,86,0,15, 0xC1E70000},
1198 {1,87,0, 6, 0xC1E70000},
1199 {1,88,0, 9, 0xC1E70000}
1200};
1201#endif
1202#if defined(MT6873)
1203#define DRIVING_SETTING_GPIO_NUM 8
1204#define DRIVING_GEAR_NUM 1
1205const gpio_driving_gear_t gpio_driving_gear[DRIVING_GEAR_NUM]=
1206{
1207 {
1208 0x07,
1209 0x08,
1210 {
1211 {0x00,2},
1212 {0x01,4},
1213 {0x02,6},
1214 {0x03,8},
1215 {0x04,10},
1216 {0x05,12},
1217 {0x06,14},
1218 {0x07,16}
1219 }
1220 },
1221};
1222const drv_gpio_driving_priv_t drv_gpio_driving_priv[DRIVING_SETTING_GPIO_NUM]=
1223{
1224 {1,57,0,24, 0xC1D30010},
1225 {1,58,0,24, 0xC1D30010},
1226 {1,59,0,27, 0xC1D30010},
1227 {1,60,0,27, 0xC1D30010},
1228 {1,85,0,21, 0xC1D30010},
1229 {1,86,0,21, 0xC1D30010},
1230 {1,87,0,18, 0xC1D30010},
1231 {1,88,0,18, 0xC1D30010}
1232};
1233#endif
1234#if defined(MT6853)
1235#define DRIVING_SETTING_GPIO_NUM 8
1236#define DRIVING_GEAR_NUM 1
1237const gpio_driving_gear_t gpio_driving_gear[DRIVING_GEAR_NUM]=
1238{
1239 {
1240 0x07,
1241 0x08,
1242 {
1243 {0x00,2},
1244 {0x01,4},
1245 {0x02,6},
1246 {0x03,8},
1247 {0x04,10},
1248 {0x05,12},
1249 {0x06,14},
1250 {0x07,16}
1251 }
1252 },
1253};
1254const drv_gpio_driving_priv_t drv_gpio_driving_priv[DRIVING_SETTING_GPIO_NUM]=
1255{
1256 {1,162,0,24, 0xC1D30000},
1257 {1,163,0,24, 0xC1D30000},
1258 {1,164,0,27, 0xC1D30000},
1259 {1,165,0,27, 0xC1D30000},
1260 {1,188,0,21, 0xC1D30000},
1261 {1,189,0,21, 0xC1D30000},
1262 {1,190,0,18, 0xC1D30000},
1263 {1,191,0,18, 0xC1D30000}
1264};
1265#endif
1266#if defined(MT6833)
1267#define DRIVING_SETTING_GPIO_NUM 8
1268#define DRIVING_GEAR_NUM 1
1269const gpio_driving_gear_t gpio_driving_gear[DRIVING_GEAR_NUM]=
1270{
1271 {
1272 0x07,
1273 0x08,
1274 {
1275 {0x00,2},
1276 {0x01,4},
1277 {0x02,6},
1278 {0x03,8},
1279 {0x04,10},
1280 {0x05,12},
1281 {0x06,14},
1282 {0x07,16}
1283 }
1284 },
1285};
1286const drv_gpio_driving_priv_t drv_gpio_driving_priv[DRIVING_SETTING_GPIO_NUM]=
1287{
1288 {1,162,0,3, 0xC1D10030},
1289 {1,163,0,3, 0xC1D10030},
1290 {1,164,0,6, 0xC1D10030},
1291 {1,165,0,6, 0xC1D10030},
1292 {1,188,0,0, 0xC1D10030},
1293 {1,189,0,0, 0xC1D10030},
1294 {1,190,0,27, 0xC1D10020},
1295 {1,191,0,27, 0xC1D10020}
1296};
1297#endif
1298#if defined(MT6877)
1299#define DRIVING_SETTING_GPIO_NUM 8
1300#define DRIVING_GEAR_NUM 1
1301const gpio_driving_gear_t gpio_driving_gear[DRIVING_GEAR_NUM]=
1302{
1303 {
1304 0x07,
1305 0x08,
1306 {
1307 {0x00,2},
1308 {0x01,4},
1309 {0x02,6},
1310 {0x03,8},
1311 {0x04,10},
1312 {0x05,12},
1313 {0x06,14},
1314 {0x07,16}
1315 }
1316 },
1317};
1318const drv_gpio_driving_priv_t drv_gpio_driving_priv[DRIVING_SETTING_GPIO_NUM]=
1319{
1320 {1,66,0, 3, 0xC1D30010},
1321 {1,67,0, 3, 0xC1D30010},
1322 {1,68,0, 0, 0xC1D30010},
1323 {1,69,0, 0, 0xC1D30010},
1324 {1,82,0,27, 0xC1D30000},
1325 {1,83,0,27, 0xC1D30000},
1326 {1,84,0,24, 0xC1D30000},
1327 {1,85,0,24, 0xC1D30000}
1328};
1329#endif
1330#if defined(CHIP10992)
1331#define DRIVING_SETTING_GPIO_NUM 8
1332#define DRIVING_GEAR_NUM 1
1333const gpio_driving_gear_t gpio_driving_gear[DRIVING_GEAR_NUM]=
1334{
1335 {
1336 0x07,
1337 0x08,
1338 {
1339 {0x00,2},
1340 {0x01,4},
1341 {0x02,6},
1342 {0x03,8},
1343 {0x04,10},
1344 {0x05,12},
1345 {0x06,14},
1346 {0x07,16}
1347 }
1348 },
1349};
1350const drv_gpio_driving_priv_t drv_gpio_driving_priv[DRIVING_SETTING_GPIO_NUM]=
1351{
1352 {1,138,0,3, 0xC1D20000},
1353 {1,139,0,3, 0xC1D20000},
1354 {1,140,0,0, 0xC1D20000},
1355 {1,141,0,0, 0xC1D20000},
1356 {1,164,0,18, 0xC1C10010},
1357 {1,165,0,18, 0xC1C10010},
1358 {1,166,0,21, 0xC1C10010},
1359 {1,167,0,21, 0xC1C10010}
1360};
1361#endif
1362/**
1363* @brief set the drive parameter of the gpio pin.
1364* @param gpio_pin : The pin which is to set drive.
1365* @param drive: the value of drive parameter to set, it should be 0~3
1366* @return GPIO_OK : set successful, GPIO_FAIL : set failed
1367*/
1368kal_int32 gpio_set_drive(gpio_pin_e gpio_pin,kal_uint32 drive)
1369{
1370#if defined(MT6763)||defined(MT6739)||defined(MT6771)|| defined(MT6765)|| defined(MT6295M)|| defined(MT3967)|| defined(MT6779)||defined(MT6297)||defined(MERCURY)
1371 return GPIO_FAIL;
1372#elif defined(MT6885)||defined(MT6873)||defined(MT6853)||defined(MT6833)||defined(MT6877)||defined(CHIP10992)
1373 kal_uint8 temp0,temp1;
1374 kal_uint8 result = 0;
1375 const drv_gpio_driving_priv_t *pGpio_driving_priv;
1376 for(temp0=0;temp0<DRIVING_SETTING_GPIO_NUM;temp0++)
1377 {
1378 if(drv_gpio_driving_priv[temp0].valid)
1379 {
1380 pGpio_driving_priv = (drv_gpio_driving_priv + temp0);
1381 if(drv_gpio_driving_priv[temp0].gpio_num==gpio_pin)
1382 {
1383 for(temp1=0;temp1<gpio_driving_gear[pGpio_driving_priv->driving_gear].gear_cnt;temp1++)
1384 {
1385 if((gpio_driving_gear[pGpio_driving_priv->driving_gear].gear_mapping[temp1][1])==drive)
1386 {
1387 DRV_WriteReg32((pGpio_driving_priv->addr+8),
1388 ((gpio_driving_gear[pGpio_driving_priv->driving_gear].mask) << (pGpio_driving_priv->offset)));
1389 DRV_WriteReg32((pGpio_driving_priv->addr+4),
1390 ((gpio_driving_gear[pGpio_driving_priv->driving_gear].gear_mapping[temp1][0]) << (pGpio_driving_priv->offset)));
1391 result = 1;
1392 break;
1393 }
1394 }
1395 }
1396 }
1397 }
1398 if(result==1)
1399 return GPIO_OK;
1400 else
1401 return GPIO_FAIL;
1402#else
1403 return GPIO_FAIL;
1404#endif
1405}
1406
1407
1408//========================================================================
1409/**
1410 * @brief get drive register value of pin
1411 * @param gpio_pin : The GPIO pin to be read.
1412 * @return return the drive register value of pin, it should be 0x0~0x3.
1413 * if gpio_pin is out of range, the return value will be GPIO_FAIL
1414 */
1415kal_int32 gpio_get_drive_value(gpio_pin_e gpio_pin)
1416{
1417#if defined(MT6763)||defined(MT6739)||defined(MT6771)|| defined(MT6765)|| defined(MT6295M)|| defined(MT3967)|| defined(MT6779)||defined(MT6297)||defined(MT6885)||defined(MERCURY)||defined(MT6873)||defined(MT6853)||defined(MT6833)||defined(MT6877)||defined(CHIP10992)
1418 return GPIO_FAIL;
1419#endif
1420}
1421
1422
1423
1424/**
1425* @brief set gpio ownership register
1426* @param pin_num : the gpio pin to set ownerhsip
1427* @param ownership : the ownership register bit value to set ,it should be 0~1
1428* 0: set ownership to MD
1429* 1: set ownership to AP
1430* @return GPIO_OK : set successful, GPIO_FAIL : set failed
1431*/
1432kal_int32 gpio_get_ownership(kal_uint32 pin_num)
1433{
1434 return GPIO_FAIL;
1435}
1436
1437void GPIO_MetaModeInit(void)
1438{
1439}
1440
1441kal_int32 GPIO_GetMetaMode(void)
1442{
1443#if defined(MT6763)||defined(MT6739)||defined(MT6771)|| defined(MT6765)|| defined(MT6295M)|| defined(MT3967)|| defined(MT6779)||defined(MT6297)||defined(MT6885)||defined(MERCURY)||defined(MT6873)||defined(MT6853)||defined(MT6833)||defined(MT6877)||defined(CHIP10992)
1444 return GPIO_FAIL;
1445#endif
1446}
1447