[T106][ZXW-22]7520V3SCV2.01.01.02P42U09_VEC_V0.8_AP_VEC origin source commit
Change-Id: Ic6e05d89ecd62fc34f82b23dcf306c93764aec4b
diff --git a/ap/lib/libcpnv/Makefile b/ap/lib/libcpnv/Makefile
new file mode 100755
index 0000000..88990b8
--- /dev/null
+++ b/ap/lib/libcpnv/Makefile
@@ -0,0 +1,36 @@
+#*******************************************************************************
+# include ZTE library makefile
+#*******************************************************************************
+include $(COMMON_MK)
+
+##############USER COMIZE BEGIN################
+LIB_STATIC = libcpnv.a
+LIB_SHARED = libcpnv.so
+
+OBJS = cpnv.o
+
+CFLAGS += -g -Werror=implicit-function-declaration
+#LDFLAGS += -lpthread
+##############USER COMIZE END##################
+
+CFLAGS += -I$(APP_DIR)/include
+#CFLAGS += -I$(TOPDIR)/pub/project/$(CHIP_NAME)/include/nv
+CFLAGS += -I$(LINUX_DIR)/include
+CFLAGS += -I$(zte_lib_path)/libnvram
+CFLAGS += -fPIC
+LDFLAGS += -shared
+
+all: $(LIB_STATIC) $(LIB_SHARED)
+
+$(LIB_STATIC) : $(OBJS)
+ $(AR) rcs $(LIB_STATIC) $(OBJS)
+
+$(LIB_SHARED): $(OBJS)
+ $(CC) $(LDFLAGS) -o $@ $^
+
+romfs:
+ $(ROMFSINST) $(LIB_SHARED) /lib/$(LIB_SHARED)
+
+clean:
+ -$(RM) *.a *.o *.so $(LIB_SHARED) $(LIB_STATIC) $(OBJS)
+
diff --git a/ap/lib/libcpnv/cpnv.c b/ap/lib/libcpnv/cpnv.c
new file mode 100755
index 0000000..cff6cfe
--- /dev/null
+++ b/ap/lib/libcpnv/cpnv.c
@@ -0,0 +1,199 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <string.h>
+#include <unistd.h>
+#include <linux/cpnv.h>
+#include "cfg_api.h"
+#include "libcpnv.h"
+
+#define CP_NV_DEV "/dev/cpnv"
+static char *cpnv_fs_mount_point[] = {"/mnt/imagefs", "/mnt/resource", "/mnt/nvrofs"};
+
+static int cpnv_dev_fd = -1;
+
+static int lib_init(void)
+{
+ int fd = open(CP_NV_DEV, O_RDWR);
+ if (fd < 0) {
+ perror("open cpnv dev fd fail\n");
+ assert(fd > 0);
+ }
+
+ return fd;
+}
+
+static unsigned int cpnv_write(int direction, unsigned int NvItemID, unsigned char *NvItemData, unsigned int NvItemLen)
+{
+ int ret;
+ unsigned char buffer[128];
+ unsigned char *tmpbuf = buffer;
+ size_t tmpbuf_len = sizeof(buffer);
+ struct cpnv_readwrite_head *phead;
+
+ //assert(NvItemID > 0);
+ assert(NvItemData != NULL);
+ assert(NvItemLen > 0);
+
+ if (cpnv_dev_fd < 0)
+ cpnv_dev_fd = lib_init();
+
+ if (NvItemLen + sizeof(struct cpnv_readwrite_head) > sizeof(buffer)) {
+ tmpbuf_len = NvItemLen + sizeof(struct cpnv_readwrite_head);
+ tmpbuf = malloc(tmpbuf_len);
+ if (tmpbuf == NULL)
+ return CPNV_ERROR;
+ }
+ phead = (struct cpnv_readwrite_head *)tmpbuf;
+ phead->direction = direction;
+ phead->NvItemID = NvItemID;
+ phead->NvItemLen = NvItemLen;
+ memcpy(phead->NvItemData, NvItemData, NvItemLen);
+
+ ret = write(cpnv_dev_fd, tmpbuf, tmpbuf_len);
+ if (ret == tmpbuf_len) {
+ ret = CPNV_OK;
+ } else {
+ perror("cpnv write error\n");
+ ret = CPNV_ERROR;
+ }
+
+ if (tmpbuf != buffer)
+ free(tmpbuf);
+
+ return ret;
+}
+
+unsigned int cpnv_NvItemWrite(unsigned int NvItemID, unsigned char *NvItemData, unsigned int NvItemLen)
+{
+ return cpnv_write(TO_NVRW, NvItemID, NvItemData, NvItemLen);
+}
+
+void cpnv_NvItemWriteFactory(unsigned int NvItemID, unsigned char *NvItemData, unsigned int NvItemLen)
+{
+ cpnv_write(TO_NVFAC, NvItemID, NvItemData, NvItemLen);
+}
+
+unsigned int cpnv_NvItemWriteNvro(unsigned int NvItemID, unsigned char *NvItemData, unsigned int NvItemLen)
+{
+ return cpnv_write(TO_NVRO, NvItemID, NvItemData, NvItemLen);
+}
+
+unsigned int cpnv_NvItemRead(unsigned int NvItemID, unsigned char *NvItemData, unsigned int NvItemLen)
+{
+ int ret;
+ unsigned char *tmpbuf = NvItemData;
+ int tmpbuf_len = NvItemLen;
+
+ //assert(NvItemID > 0);
+ assert(NvItemData != NULL);
+ assert(NvItemLen > 0);
+
+ if (cpnv_dev_fd < 0)
+ cpnv_dev_fd = lib_init();
+
+ if (NvItemLen < sizeof(NvItemID)) {
+ tmpbuf_len = sizeof(NvItemID);
+ tmpbuf = malloc(tmpbuf_len);
+ if (tmpbuf == NULL)
+ return CPNV_ERROR;
+ }
+
+ memcpy(tmpbuf, &NvItemID, sizeof(NvItemID));
+ ret = read(cpnv_dev_fd, tmpbuf, tmpbuf_len);
+ if (ret > 0) {
+ memcpy(NvItemData, tmpbuf, NvItemLen);
+ ret = CPNV_OK;
+ } else {
+ perror("cpnv read error\n");
+ bzero(NvItemData, NvItemLen);
+ ret = CPNV_ERROR;
+ }
+
+ if (tmpbuf != NvItemData)
+ free(tmpbuf);
+
+ return ret;
+}
+
+unsigned int cpnv_NvramFlush(void)
+{
+ int ret = CPNV_OK;
+
+ if (cpnv_dev_fd < 0)
+ cpnv_dev_fd = lib_init();
+
+ ret = ioctl(cpnv_dev_fd, CPNV_IOIOCTL_FLUSH);
+ if (ret < 0) {
+ perror("cpnv ioctrl error\n");
+ ret = CPNV_ERROR;
+ }
+
+ return ret;
+}
+
+unsigned int cpnv_ResetNVFactory(void)
+{
+ int ret = CPNV_OK;
+
+ if (cpnv_dev_fd < 0)
+ cpnv_dev_fd = lib_init();
+
+ ret = ioctl(cpnv_dev_fd, CPNV_IOIOCTL_RESETNVFACTORY);
+ if (ret < 0) {
+ perror("cpnv ioctrl error\n");
+ ret = CPNV_ERROR;
+ }
+
+ return (unsigned int)ret;
+}
+
+unsigned int cpnv_ChangeFsPartitionAttr(int partition_no, int writable)
+{
+ char cmd[64] = {0};
+ int ret = 0;
+
+ if(partition_no >= FS_PARTITION_NO_MAX)
+ return CPNV_ERROR;
+
+ if(writable)
+ snprintf(cmd, 64, "/bin/mount -o remount,%s %s", "rw", cpnv_fs_mount_point[partition_no]);
+ else
+ snprintf(cmd, 64, "/bin/mount -o remount,%s %s", "ro", cpnv_fs_mount_point[partition_no]);
+
+ ret = zxic_system(cmd);
+ if(0 == ret)
+ return CPNV_OK;
+ else
+ return CPNV_ERROR;
+}
+
+unsigned int cpnv_ChangeNvRoAttr(int writable)
+{
+ return cpnv_ChangeFsPartitionAttr(FS_NVROFS, writable);
+}
+
+unsigned int cpnv_FsGcWait(int partition_no)
+{
+ int ret = CPNV_ERROR;
+
+ switch(partition_no)
+ {
+ case FS_IMAGEFS:
+ case FS_RESOURCEFS:
+ case FS_NVROFS:
+ syscall(SYSCALL_jffs2_quick_gc_wait_done, partition_no);
+ ret = CPNV_OK;
+ break;
+ default:
+ ret = CPNV_ERROR;
+ }
+
+ return ret;
+}
+