summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/target/hosted/samsungypr/gpio-ypr.c94
-rw-r--r--firmware/target/hosted/samsungypr/gpio-ypr.h25
-rw-r--r--firmware/target/hosted/samsungypr/ypr0/button-ypr0.c27
-rw-r--r--firmware/target/hosted/samsungypr/ypr0/system-ypr0.c7
-rw-r--r--firmware/target/hosted/samsungypr/ypr1/button-ypr1.c15
5 files changed, 139 insertions, 29 deletions
diff --git a/firmware/target/hosted/samsungypr/gpio-ypr.c b/firmware/target/hosted/samsungypr/gpio-ypr.c
index e5abc4cdc9..d6a19da34f 100644
--- a/firmware/target/hosted/samsungypr/gpio-ypr.c
+++ b/firmware/target/hosted/samsungypr/gpio-ypr.c
@@ -8,7 +8,7 @@
8 * 8 *
9 * Module wrapper for GPIO, using kernel module of Samsung YP-R0/YP-R1 9 * Module wrapper for GPIO, using kernel module of Samsung YP-R0/YP-R1
10 * 10 *
11 * Copyright (c) 2011 Lorenzo Miori 11 * Copyright (c) 2011-2015 Lorenzo Miori
12 * 12 *
13 * This program is free software; you can redistribute it and/or 13 * This program is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU General Public License 14 * modify it under the terms of the GNU General Public License
@@ -23,16 +23,42 @@
23#include <stdio.h> 23#include <stdio.h>
24#include <unistd.h> 24#include <unistd.h>
25#include <fcntl.h> 25#include <fcntl.h>
26#include <gpio-ypr.h> /* includes common ioctl device definitions */
27#include <sys/ioctl.h> 26#include <sys/ioctl.h>
28 27
28#include "panic.h"
29#include "gpio-ypr.h" /* includes common ioctl device definitions */
30
29static int gpio_dev = 0; 31static int gpio_dev = 0;
30 32
33#ifdef GPIO_DEBUG
34// 3 banks of 32 pins
35static const char *pin_use[3][32];
36
37void gpio_acquire(unsigned bank, unsigned pin, const char *name)
38{
39 if(pin_use[bank][pin] != NULL && pin_use[bank][pin] != name)
40 panicf("acquire B%dP%02d for %s, was %s!", bank, pin, name, pin_use[bank][pin]);
41 pin_use[bank][pin] = name;
42}
43
44void gpio_release(unsigned bank, unsigned pin, const char *name)
45{
46 if(pin_use[bank][pin] != NULL && pin_use[bank][pin] != name)
47 panicf("release B%dP%02d for %s: was %s!", bank, pin, name, pin_use[bank][pin]);
48 pin_use[bank][pin] = NULL;
49}
50
51const char *gpio_blame(unsigned bank, unsigned pin)
52{
53 return pin_use[bank][pin];
54}
55#endif
56
31void gpio_init(void) 57void gpio_init(void)
32{ 58{
33 gpio_dev = open(GPIO_DEVICE, O_RDONLY); 59 gpio_dev = open(GPIO_DEVICE, O_RDONLY);
34 if (gpio_dev < 0) 60 if (gpio_dev < 0)
35 printf("GPIO device open error!"); 61 panicf("GPIO device open error!");
36} 62}
37 63
38void gpio_close(void) 64void gpio_close(void)
@@ -41,8 +67,68 @@ void gpio_close(void)
41 close(gpio_dev); 67 close(gpio_dev);
42} 68}
43 69
44int gpio_control(int request, int num, int mode, int val) 70static int gpio_control(int request, int num, int mode, int val)
45{ 71{
46 struct gpio_info r = { .num = num, .mode = mode, .val = val, }; 72 struct gpio_info r = { .num = num, .mode = mode, .val = val, };
47 return ioctl(gpio_dev, request, &r); 73 return ioctl(gpio_dev, request, &r);
48} 74}
75
76void gpio_set_iomux(int pin, int iomux)
77{
78 if (gpio_control(DEV_CTRL_GPIO_SET_MUX, pin, iomux, 0) != 0)
79 {
80 panicf("Unable to set iomux to pin %d", pin);
81 }
82}
83
84void gpio_free_iomux(int pin, int iomux)
85{
86 if (gpio_control(DEV_CTRL_GPIO_UNSET_MUX, pin, iomux, 0) != 0)
87 {
88 panicf("Unable to free iomux to pin %d", pin);
89 }
90}
91
92void gpio_set_pad(int pin, int type)
93{
94 if (gpio_control(DEV_CTRL_GPIO_SET_TYPE, pin, type, 0) != 0)
95 {
96 panicf("Unable to set pad to pin %d", pin);
97 }
98}
99
100void gpio_direction_output(int pin)
101{
102 if (gpio_control(DEV_CTRL_GPIO_SET_OUTPUT, pin, 0, 0) != 0)
103 {
104 panicf("Unable to set output direction to pin %d", pin);
105 }
106}
107
108void gpio_direction_input(int pin)
109{
110 if (gpio_control(DEV_CTRL_GPIO_SET_INPUT, pin, 0, 0) != 0)
111 {
112 panicf("Unable to set input direction to pin %d", pin);
113 }
114}
115
116bool gpio_get(int pin)
117{
118 return gpio_control(DEV_CTRL_GPIO_GET_VAL, pin, 0, 0);
119}
120
121void gpio_set(int pin, bool value)
122{
123 int ret = -1;
124
125 if (value)
126 ret = gpio_control(DEV_CTRL_GPIO_SET_HIGH, pin, 0, 0);
127 else
128 ret = gpio_control(DEV_CTRL_GPIO_SET_LOW, pin, 0, 0);
129
130 if (ret != 0)
131 {
132 panicf("Unable to set input direction to pin %d", pin);
133 }
134}
diff --git a/firmware/target/hosted/samsungypr/gpio-ypr.h b/firmware/target/hosted/samsungypr/gpio-ypr.h
index c10991e20c..c7214de6c0 100644
--- a/firmware/target/hosted/samsungypr/gpio-ypr.h
+++ b/firmware/target/hosted/samsungypr/gpio-ypr.h
@@ -24,6 +24,20 @@
24/* Specifies device name and ioctl magic */ 24/* Specifies device name and ioctl magic */
25#include "gpio-target.h" 25#include "gpio-target.h"
26#include "sys/ioctl.h" 26#include "sys/ioctl.h"
27#include "stdbool.h"
28
29// set to debug pinctrl use
30#define GPIO_DEBUG
31
32#ifdef GPIO_DEBUG
33void imx233_pinctrl_acquire(unsigned bank, unsigned pin, const char *name);
34void imx233_pinctrl_release(unsigned bank, unsigned pin, const char *name);
35const char *imx233_pinctrl_blame(unsigned bank, unsigned pin);
36#else
37#define imx233_pinctrl_acquire(...)
38#define imx233_pinctrl_release(...)
39#define imx233_pinctrl_get_pin_use(...) NULL
40#endif
27 41
28struct gpio_info { 42struct gpio_info {
29 int num; 43 int num;
@@ -193,9 +207,16 @@ enum
193 PAD_CTL_DRV_VOT_HIGH = 0x1 << 13, 207 PAD_CTL_DRV_VOT_HIGH = 0x1 << 13,
194}; 208};
195 209
210/* Driver-related functions */
196void gpio_init(void); 211void gpio_init(void);
197void gpio_close(void); 212void gpio_close(void);
198int gpio_control_struct(int request, struct gpio_info pin);
199int gpio_control(int request, int num, int mode, int val);
200 213
214/* Exported API */
215void gpio_set_iomux(int pin, int iomux);
216void gpio_free_iomux(int pin, int iomux);
217void gpio_set_pad(int pin, int type);
218void gpio_direction_output(int pin);
219void gpio_direction_input(int pin);
220bool gpio_get(int pin);
221void gpio_set(int pin, bool value);
201#endif 222#endif
diff --git a/firmware/target/hosted/samsungypr/ypr0/button-ypr0.c b/firmware/target/hosted/samsungypr/ypr0/button-ypr0.c
index 08aacd18c6..860ad50cae 100644
--- a/firmware/target/hosted/samsungypr/ypr0/button-ypr0.c
+++ b/firmware/target/hosted/samsungypr/ypr0/button-ypr0.c
@@ -31,31 +31,31 @@ int button_read_device(void)
31 int key = BUTTON_NONE; 31 int key = BUTTON_NONE;
32 32
33 /* Check for all the keys */ 33 /* Check for all the keys */
34 if (!gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_USER_KEY, 0, 0)) { 34 if (!gpio_get(GPIO_USER_KEY)) {
35 key |= BUTTON_USER; 35 key |= BUTTON_USER;
36 } 36 }
37 if (!gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_CENTRAL_KEY, 0, 0)) { 37 if (!gpio_get(GPIO_CENTRAL_KEY)) {
38 key |= BUTTON_SELECT; 38 key |= BUTTON_SELECT;
39 } 39 }
40 if (!gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_UP_KEY, 0, 0)) { 40 if (!gpio_get(GPIO_UP_KEY)) {
41 key |= BUTTON_UP; 41 key |= BUTTON_UP;
42 } 42 }
43 if (!gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_DOWN_KEY, 0, 0)) { 43 if (!gpio_get(GPIO_DOWN_KEY)) {
44 key |= BUTTON_DOWN; 44 key |= BUTTON_DOWN;
45 } 45 }
46 if (!gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_LEFT_KEY, 0, 0)) { 46 if (!gpio_get(GPIO_LEFT_KEY)) {
47 key |= BUTTON_LEFT; 47 key |= BUTTON_LEFT;
48 } 48 }
49 if (!gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_RIGHT_KEY, 0, 0)) { 49 if (!gpio_get(GPIO_RIGHT_KEY)) {
50 key |= BUTTON_RIGHT; 50 key |= BUTTON_RIGHT;
51 } 51 }
52 if (!gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_MENU_KEY, 0, 0)) { 52 if (!gpio_get(GPIO_MENU_KEY)) {
53 key |= BUTTON_MENU; 53 key |= BUTTON_MENU;
54 } 54 }
55 if (!gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_BACK_KEY, 0, 0)) { 55 if (!gpio_get(GPIO_BACK_KEY)) {
56 key |= BUTTON_BACK; 56 key |= BUTTON_BACK;
57 } 57 }
58 if (gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_POWER_KEY, 0, 0)) { 58 if (gpio_get(GPIO_POWER_KEY)) {
59 key |= BUTTON_POWER; 59 key |= BUTTON_POWER;
60 } 60 }
61 61
@@ -65,14 +65,15 @@ int button_read_device(void)
65bool headphones_inserted(void) 65bool headphones_inserted(void)
66{ 66{
67 /* GPIO low - 0 - means headphones inserted */ 67 /* GPIO low - 0 - means headphones inserted */
68 return !gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_HEADPHONE_SENSE, 0, 0); 68 return !gpio_get(GPIO_HEADPHONE_SENSE);
69} 69}
70 70
71void button_init_device(void) 71void button_init_device(void)
72{ 72{
73 /* Setup GPIO pin for headphone sense, copied from OF */ 73 /* Setup GPIO pin for headphone sense, copied from OF */
74 gpio_control(DEV_CTRL_GPIO_SET_MUX, GPIO_HEADPHONE_SENSE, CONFIG_SION, PAD_CTL_47K_PU); 74 gpio_set_iomux(GPIO_HEADPHONE_SENSE, CONFIG_GPIO);
75 gpio_control(DEV_CTRL_GPIO_SET_INPUT, GPIO_HEADPHONE_SENSE, CONFIG_SION, PAD_CTL_47K_PU); 75 gpio_set_pad(GPIO_HEADPHONE_SENSE, PAD_CTL_47K_PU);
76 gpio_direction_input(GPIO_HEADPHONE_SENSE);
76 77
77 /* No need to initialize any GPIO pin, since this is done loading the r0Btn module */ 78 /* No need to initialize any GPIO pin, since this is done loading the r0Btn module */
78} 79}
@@ -82,6 +83,6 @@ void button_init_device(void)
82void button_close_device(void) 83void button_close_device(void)
83{ 84{
84 /* Don't know the precise meaning, but it's done as in the OF, so copied there */ 85 /* Don't know the precise meaning, but it's done as in the OF, so copied there */
85 gpio_control(DEV_CTRL_GPIO_UNSET_MUX, GPIO_HEADPHONE_SENSE, CONFIG_SION, 0); 86 gpio_free_iomux(GPIO_HEADPHONE_SENSE, CONFIG_GPIO);
86} 87}
87#endif /* BUTTON_DRIVER_CLOSE */ 88#endif /* BUTTON_DRIVER_CLOSE */
diff --git a/firmware/target/hosted/samsungypr/ypr0/system-ypr0.c b/firmware/target/hosted/samsungypr/ypr0/system-ypr0.c
index 9cc307073b..2544174252 100644
--- a/firmware/target/hosted/samsungypr/ypr0/system-ypr0.c
+++ b/firmware/target/hosted/samsungypr/ypr0/system-ypr0.c
@@ -88,7 +88,7 @@ bool hostfs_present(IF_MD_NONVOID(int drive))
88{ 88{
89#ifdef HAVE_MULTIDRIVE 89#ifdef HAVE_MULTIDRIVE
90 if (drive > 0) /* Active LOW */ 90 if (drive > 0) /* Active LOW */
91 return (!gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_SD_SENSE, 0, 0)); 91 return (!gpio_get(GPIO_SD_SENSE));
92 else 92 else
93#endif 93#endif
94 return true; /* internal: always present */ 94 return true; /* internal: always present */
@@ -229,8 +229,9 @@ static void NORETURN_ATTR sd_thread(void)
229int hostfs_init(void) 229int hostfs_init(void)
230{ 230{
231 /* Setup GPIO pin for microSD sense, copied from OF */ 231 /* Setup GPIO pin for microSD sense, copied from OF */
232 gpio_control(DEV_CTRL_GPIO_SET_MUX, GPIO_SD_SENSE, CONFIG_DEFAULT, 0); 232 gpio_set_iomux(GPIO_SD_SENSE, CONFIG_DEFAULT);
233 gpio_control(DEV_CTRL_GPIO_SET_INPUT, GPIO_SD_SENSE, CONFIG_DEFAULT, 0); 233 gpio_set_pad(GPIO_SD_SENSE, PAD_CTL_SRE_SLOW);
234 gpio_direction_input(GPIO_SD_SENSE);
234#ifdef HAVE_MULTIDRIVE 235#ifdef HAVE_MULTIDRIVE
235 if (storage_present(IF_MD(1))) 236 if (storage_present(IF_MD(1)))
236 mount_sd(); 237 mount_sd();
diff --git a/firmware/target/hosted/samsungypr/ypr1/button-ypr1.c b/firmware/target/hosted/samsungypr/ypr1/button-ypr1.c
index d12b8486b6..26755716f4 100644
--- a/firmware/target/hosted/samsungypr/ypr1/button-ypr1.c
+++ b/firmware/target/hosted/samsungypr/ypr1/button-ypr1.c
@@ -45,13 +45,13 @@ int button_read_device(int *data)
45 struct mcs5000_raw_data touchpad_data; 45 struct mcs5000_raw_data touchpad_data;
46 46
47 /* Check for all the keys */ 47 /* Check for all the keys */
48 if (!gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_VOL_UP_KEY, 0, 0)) { 48 if (!gpio_get(GPIO_VOL_UP_KEY)) {
49 key |= BUTTON_VOL_UP; 49 key |= BUTTON_VOL_UP;
50 } 50 }
51 if (!gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_VOL_DOWN_KEY, 0, 0)) { 51 if (!gpio_get(GPIO_VOL_DOWN_KEY)) {
52 key |= BUTTON_VOL_DOWN; 52 key |= BUTTON_VOL_DOWN;
53 } 53 }
54 if (gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_POWER_KEY, 0, 0)) { 54 if (gpio_get(GPIO_POWER_KEY)) {
55 key |= BUTTON_POWER; 55 key |= BUTTON_POWER;
56 } 56 }
57 57
@@ -99,7 +99,7 @@ void touchscreen_enable_device(bool en)
99bool headphones_inserted(void) 99bool headphones_inserted(void)
100{ 100{
101 /* GPIO low - 0 - means headphones inserted */ 101 /* GPIO low - 0 - means headphones inserted */
102 return !gpio_control(DEV_CTRL_GPIO_IS_HIGH, GPIO_HEADPHONE_SENSE, 0, 0); 102 return !gpio_get(GPIO_HEADPHONE_SENSE);
103} 103}
104 104
105void button_init_device(void) 105void button_init_device(void)
@@ -107,8 +107,9 @@ void button_init_device(void)
107 /* Setup GPIO pin for headphone sense, copied from OF 107 /* Setup GPIO pin for headphone sense, copied from OF
108 * Pins for the other buttons are already set up by OF button module 108 * Pins for the other buttons are already set up by OF button module
109 */ 109 */
110 gpio_control(DEV_CTRL_GPIO_SET_MUX, GPIO_HEADPHONE_SENSE, 4, 0); 110 gpio_set_iomux(GPIO_HEADPHONE_SENSE, CONFIG_ALT4);
111 gpio_control(DEV_CTRL_GPIO_SET_INPUT, GPIO_HEADPHONE_SENSE, 4, 0); 111 gpio_set_pad(GPIO_HEADPHONE_SENSE, PAD_CTL_SRE_SLOW);
112 gpio_direction_input(GPIO_HEADPHONE_SENSE);
112 113
113 /* Turn on touchscreen */ 114 /* Turn on touchscreen */
114 mcs5000_init(); 115 mcs5000_init();
@@ -120,7 +121,7 @@ void button_init_device(void)
120/* I'm not sure it's called at shutdown...give a check! */ 121/* I'm not sure it's called at shutdown...give a check! */
121void button_close_device(void) 122void button_close_device(void)
122{ 123{
123 gpio_control(DEV_CTRL_GPIO_UNSET_MUX, GPIO_HEADPHONE_SENSE, 0, 0); 124 gpio_free_iomux(GPIO_HEADPHONE_SENSE, CONFIG_ALT4);
124 125
125 /* Turn off touchscreen device */ 126 /* Turn off touchscreen device */
126 mcs5000_shutdown(); 127 mcs5000_shutdown();