summaryrefslogtreecommitdiff
path: root/display.c
diff options
context:
space:
mode:
Diffstat (limited to 'display.c')
-rw-r--r--display.c61
1 files changed, 44 insertions, 17 deletions
diff --git a/display.c b/display.c
index 3593e99..0115b91 100644
--- a/display.c
+++ b/display.c
@@ -21,6 +21,7 @@
static DEFINE_MUTEX(nanohub_display_mutex);
static DECLARE_COMPLETION(message_callback);
static int display_state;
+static bool allow_read_mcu_disp_state_once = false;
ssize_t nanohub_pin_display_select_get(struct device *dev,
struct device_attribute *attr, char *buf)
@@ -38,8 +39,11 @@ ssize_t nanohub_pin_display_select_set(struct device *dev,
struct nanohub_data *data = dev_get_drvdata(dev);
const struct nanohub_platform_data *pdata = data->pdata;
if (count >= 1 && buf[0] == '0') {
+ allow_read_mcu_disp_state_once = false;
gpio_set_value(pdata->display_select_gpio, 0);
} else if (count >= 1 && buf[0] == '1') {
+ if (gpio_get_value(pdata->display_select_gpio) == 0)
+ allow_read_mcu_disp_state_once = true;
gpio_set_value(pdata->display_select_gpio, 1);
}
return count;
@@ -47,35 +51,56 @@ ssize_t nanohub_pin_display_select_set(struct device *dev,
ssize_t nanohub_get_display_state(struct device *dev, struct device_attribute *attr, char *buf)
{
- int display_state = nanohub_query_display_state();
+ struct nanohub_data *data = dev_get_drvdata(dev);
+ int display_state = nanohub_query_display_state_internal(data, true);
+ return scnprintf(buf, PAGE_SIZE, "%d", display_state);
+}
+
+ssize_t nanohub_get_display_state_no_check(struct device *dev, struct device_attribute *attr,
+ char *buf)
+{
+ struct nanohub_data *data = dev_get_drvdata(dev);
+ int display_state = nanohub_query_display_state_internal(data, false);
return scnprintf(buf, PAGE_SIZE, "%d", display_state);
}
-#define NANOHUB_DISPLAY_COMMAND_TYPE_GET_STATE 0x06
#define NANOHUB_DISPLAY_GET_STATE_TIMEOUT_MS 100
+enum nanohub_display_command_type {
+ NANOHUB_DISPLAY_COMMAND_GET_STATE = 0x06,
+ NANOHUB_DISPLAY_COMMAND_GET_STATE_NO_CHECK = 0x07,
+};
+
static void on_message_received(const char *buffer, size_t length)
{
if (length == 3 && buffer[0] == NANOHUB_DISPLAY_COMMAND_VERSION &&
- buffer[1] == NANOHUB_DISPLAY_COMMAND_TYPE_GET_STATE) {
+ buffer[1] == NANOHUB_DISPLAY_COMMAND_GET_STATE) {
display_state = buffer[2];
}
complete(&message_callback);
}
-int nanohub_query_display_state_internal(struct nanohub_data *data)
+int nanohub_query_display_state_internal(struct nanohub_data *data, bool check_ownership)
{
const char message[] = { NANOHUB_DISPLAY_COMMAND_VERSION,
- NANOHUB_DISPLAY_COMMAND_TYPE_GET_STATE };
+ check_ownership ? NANOHUB_DISPLAY_COMMAND_GET_STATE :
+ NANOHUB_DISPLAY_COMMAND_GET_STATE_NO_CHECK };
long ret;
- const struct nanohub_platform_data *pdata;
-
- if (unlikely(data == NULL))
- return -EINVAL;
- pdata = data->pdata;
- if (gpio_get_value(pdata->display_select_gpio) == 1)
- return MCU_DISPLAY_NONE;
+ if (check_ownership) {
+ const struct nanohub_platform_data *pdata;
+ if (unlikely(data == NULL))
+ return -EINVAL;
+
+ pdata = data->pdata;
+ if (gpio_get_value(pdata->display_select_gpio) == 1)
+ return MCU_DISPLAY_NONE;
+ } else {
+ if (allow_read_mcu_disp_state_once)
+ allow_read_mcu_disp_state_once = false;
+ else
+ return MCU_DISPLAY_NONE;
+ }
mutex_lock(&nanohub_display_mutex);
@@ -92,11 +117,13 @@ int nanohub_query_display_state_internal(struct nanohub_data *data)
mutex_unlock(&nanohub_display_mutex);
- if (ret < 0)
- return ret;
-
- if (ret == 0)
- return -ETIMEDOUT;
+ if (ret <= 0) {
+ pr_err("nanohub : failed to query disp, ret = %d\n", ret);
+ if (ret == 0)
+ return -ETIMEDOUT;
+ else
+ return ret;
+ }
return display_state;
}