Add hal board functions to manipulate partition/upgrade parameters 34/277834/2 accepted/tizen/unified/20220715.141308 submit/tizen/20220714.055817
authorSangYoun Kwak <sy.kwak@samsung.com>
Thu, 14 Jul 2022 04:47:20 +0000 (13:47 +0900)
committerSangYoun Kwak <sy.kwak@samsung.com>
Thu, 14 Jul 2022 05:13:39 +0000 (14:13 +0900)
Change-Id: Ie3946532dbb0c93026fe94156b32504bf3b45fe0
Signed-off-by: SangYoun Kwak <sy.kwak@samsung.com>
hw/board/board.c

index 061e51146bb9d5a54748b177b857f9f5cb9f7cf9..775a725992dc341585706e11a5dd7232869b7cac 100644 (file)
 #include <stdlib.h>
 #include <errno.h>
 #include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
 
 #include </hal/include/device/hal-backend-common.h>
 #include <libsyscommon/file.h>
 
-#define PARTITION_PARAM_PATH "/mnt/inform/partition-param.bin"
-#define SERIAL_FILE_PATH     "/sys/firmware/devicetree/base/serial-number"
-#define LINE_LEN             64
+#define INFORM_MNT_PATH          "/mnt/inform"
+#define PARTITION_AB_PATH        INFORM_MNT_PATH"/partition-ab.info"
+#define PARTITION_AB_CLONED_PATH INFORM_MNT_PATH"/partition-ab-cloned.info"
+#define UPGRADE_STATUS_PATH      INFORM_MNT_PATH"/upgrade-status.info"
+#define SERIAL_FILE_PATH         "/sys/firmware/devicetree/base/serial-number"
+
+#define INT_BUFFER_LEN 32
+#define LINE_LEN       64
 
 static int get_device_serial_number(char *buffer, int len)
 {
@@ -89,7 +96,55 @@ static int switch_partition(char partition_ab)
                return -EINVAL;
        }
 
-       return sys_write_buf(PARTITION_PARAM_PATH, next_partition_ab);
+       return sys_write_buf(PARTITION_AB_PATH, next_partition_ab);
+}
+
+static int set_partition_ab_cloned(void)
+{
+       return sys_write_buf(PARTITION_AB_CLONED_PATH, "1");
+}
+
+static int clear_partition_ab_cloned(void)
+{
+       return sys_write_buf(PARTITION_AB_CLONED_PATH, "0");
+}
+
+static int get_partition_ab_cloned(int *cloned)
+{
+       return sys_get_int(PARTITION_AB_CLONED_PATH, cloned);
+}
+
+static int set_upgrade_status(int status)
+{
+       int fd;
+       int ferror;
+       char buf[INT_BUFFER_LEN];
+       int buf_strlen;
+       int written_len;
+
+       buf_strlen = snprintf(buf, sizeof(buf), "%d", status);
+
+       /* file should be truncated before writing status to it */
+       errno = 0;
+       fd = open(UPGRADE_STATUS_PATH, O_WRONLY | O_TRUNC);
+       if (fd < 0) {
+               ferror = errno;
+               errno = 0;
+               return -ferror;
+       }
+
+       errno = 0;
+       written_len = write(fd, buf, buf_strlen);
+       if (written_len < 0) {
+               ferror = errno;
+               errno = 0;
+               close(fd);
+               return -ferror;
+       }
+
+       close(fd);
+
+       return 0;
 }
 
 static int board_init(void **data)
@@ -100,9 +155,14 @@ static int board_init(void **data)
        if (!board_funcs)
                return -ENOMEM;
 
-       board_funcs->get_device_serial_number = get_device_serial_number;
-       board_funcs->get_current_partition = get_current_partition;
-       board_funcs->switch_partition = switch_partition;
+       board_funcs->get_device_serial_number  = get_device_serial_number;
+       board_funcs->get_current_partition     = get_current_partition;
+       board_funcs->switch_partition          = switch_partition;
+       board_funcs->set_partition_ab_cloned   = set_partition_ab_cloned;
+       board_funcs->clear_partition_ab_cloned = clear_partition_ab_cloned;
+       board_funcs->get_partition_ab_cloned   = get_partition_ab_cloned;
+
+       board_funcs->set_upgrade_status        = set_upgrade_status;
 
        *data = (void *)board_funcs;