summaryrefslogtreecommitdiffstatsabout
diff options
context:
space:
mode:
authorGavin.Bai <gavin_8724@163.com>2019-11-13 13:57:40 (GMT)
committer Gavin.Bai <gavin_8724@163.com>2019-11-13 13:57:40 (GMT)
commit68095471f6e9a2f56055bbf433a32a923f3444bc (patch)
tree3b7afcce758db65c62b5f09d2d0395186c2b1780
parent041107f73bd620a7b720c3f01a000be885a4d39b (diff)
downloadAIC-OS-master.zip
Add kernel modules with different functions for computer applied in satellite.HEADmaster
-rw-r--r--SylixOS/kmodule/mpc750_can/mpc750_can.c317
-rw-r--r--SylixOS/kmodule/mpc750_edac/mpc750_edac.c412
-rw-r--r--SylixOS/kmodule/mpc750_edac/mpc750_edac_com.h20
-rw-r--r--SylixOS/kmodule/mpc750_encrypt/mpc750_encrypt.c720
-rw-r--r--SylixOS/kmodule/mpc750_encrypt/mpc750_encrypt_com.h15
-rw-r--r--SylixOS/kmodule/mpc750_gps_tick/mpc750_gps_tick.c382
-rw-r--r--SylixOS/kmodule/mpc750_gws/mpc750_gws.c715
-rw-r--r--SylixOS/kmodule/mpc750_gws/mpc750_gws_com.h18
-rw-r--r--SylixOS/kmodule/mpc750_keyarea/mpc750_keyarea.c346
-rw-r--r--SylixOS/kmodule/mpc750_keyarea/mpc750_keyarea_com.h29
-rw-r--r--SylixOS/kmodule/mpc750_mpi/mpc750_mpi.c1110
-rw-r--r--SylixOS/kmodule/mpc750_mpi/mpc750_mpi_com.h36
-rw-r--r--SylixOS/kmodule/mpc750_nand/mpc750_nand.c603
-rw-r--r--SylixOS/kmodule/mpc750_nand/mpc750_nand_com.h41
-rw-r--r--SylixOS/kmodule/mpc750_rtcs/mpc750_rtc.c434
-rw-r--r--SylixOS/kmodule/mpc750_rtcs/mpc750_rtc.h26
-rw-r--r--SylixOS/kmodule/mpc750_rtcs/mpc750_rtc_com.h39
-rw-r--r--SylixOS/kmodule/mpc750_rtcs/mpc750_rtc_proc.c111
-rw-r--r--SylixOS/kmodule/mpc750_sysstatus/mpc750_sysstatus.c355
-rw-r--r--SylixOS/kmodule/mpc750_sysstatus/mpc750_sysstatus_com.h32
-rw-r--r--SylixOS/kmodule/mpc750_tc/mpc750_tc.c298
-rw-r--r--SylixOS/kmodule/mpc750_tm/mpc750_tm.c432
-rw-r--r--SylixOS/kmodule/mpc750_vote/mpc750_vote.c328
-rw-r--r--SylixOS/kmodule/mpc750_vote/mpc750_vote_com.h29
-rw-r--r--SylixOS/kmodule/mpc750_wdg/mpc750_wdg.c352
-rw-r--r--SylixOS/kmodule/mpc750_wdg/mpc750_wdg_com.h31
-rw-r--r--out.map563
27 files changed, 7794 insertions, 0 deletions
diff --git a/SylixOS/kmodule/mpc750_can/mpc750_can.c b/SylixOS/kmodule/mpc750_can/mpc750_can.c
new file mode 100644
index 0000000..98fe4e9
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_can/mpc750_can.c
@@ -0,0 +1,317 @@
+/*********************************************************************************************************
+ **
+ ** 中国软件开源组织
+ **
+ ** 嵌入式实时操作系统
+ **
+ ** SylixOS(TM)
+ **
+ ** Copyright All Rights Reserved
+ **
+ **--------------文件信息--------------------------------------------------------------------------------
+ **
+ ** 文 件 名: mpc750_can.c
+ **
+ ** 创 建 人: Gavin.Bai
+ **
+ ** 文件创建日期: 2018 年 09 月 20 日
+ **
+ ** 描 述: SJA1000 CAN 驱动
+ ********************************************************************************************************/
+
+#define __SYLIXOS_KERNEL
+#define __SYLIXOS_STDIO
+#include <SylixOS.h>
+#include <module.h>
+#include <string.h>
+
+#include "driver/can/sja1000.h"
+
+/*********************************************************************************************************
+ 定义
+*********************************************************************************************************/
+#define __SJA1000_TX_FIFO_SIZE (256)
+#define __SJA1000_RX_FIFO_SIZE (256)
+
+/*********************************************************************************************************
+ SJA1000 相关定义
+*********************************************************************************************************/
+
+#define SAST804_SJA1000_NR (4)
+
+#define SAST804_SJA1000_0_BASE (0x40000000)
+#define SAST804_SJA1000_1_BASE (0x40000100)
+#define SAST804_SJA1000_2_BASE (0x50000000)
+#define SAST804_SJA1000_3_BASE (0x50000100)
+
+#define SAST804_SJA1000_0_VECTOR (5)
+#define SAST804_SJA1000_1_VECTOR (6)
+#define SAST804_SJA1000_2_VECTOR (7)
+#define SAST804_SJA1000_3_VECTOR (8)
+
+#define SAST804_INT_STATUS_REG (0x30000000)
+#define SAST804_INT_CLEAR(vector) write32(1 << vector, SAST804_INT_STATUS_REG)
+
+/*********************************************************************************************************
+ SJA1000 通道私有数据
+*********************************************************************************************************/
+typedef struct {
+ addr_t phy_base;
+ size_t phy_size;
+ addr_t virt_base;
+ ULONG vector;
+} can_dev_t;
+
+/*********************************************************************************************************
+ SJA1000 通道私有数据
+*********************************************************************************************************/
+static can_dev_t sja1000_chan_priv[SAST804_SJA1000_NR] = {
+ {
+ SAST804_SJA1000_0_BASE,
+ LW_CFG_VMM_PAGE_SIZE,
+ SAST804_SJA1000_0_BASE,
+ SAST804_SJA1000_0_VECTOR
+ },
+
+#if SAST804_SJA1000_NR > 1
+ {
+ SAST804_SJA1000_1_BASE,
+ LW_CFG_VMM_PAGE_SIZE,
+ SAST804_SJA1000_1_BASE,
+ SAST804_SJA1000_1_VECTOR
+ },
+#endif
+
+#if SAST804_SJA1000_NR > 2
+ {
+ SAST804_SJA1000_2_BASE,
+ LW_CFG_VMM_PAGE_SIZE,
+ SAST804_SJA1000_2_BASE,
+ SAST804_SJA1000_2_VECTOR
+ },
+#endif
+
+#if SAST804_SJA1000_NR > 3
+ {
+ SAST804_SJA1000_3_BASE,
+ LW_CFG_VMM_PAGE_SIZE,
+ SAST804_SJA1000_3_BASE,
+ SAST804_SJA1000_3_VECTOR
+ },
+#endif
+};
+
+/*********************************************************************************************************
+ SJA1000 通道
+*********************************************************************************************************/
+static SJA1000_CHAN sja1000_chans[SAST804_SJA1000_NR];
+
+/********************************************************************************************************
+ ** 函数名称: can_isr
+ ** 功能描述: CAN中断处理函数
+ ** 输 入 : can_chanp 设备
+ ** vector 中断向量
+ ** 输 出 : 中断返回值
+ ** 全局变量:
+ ** 调用模块:
+ ********************************************************************************************************/
+static irqreturn_t can_isr(SJA1000_CHAN *can_chanp, ULONG vector)
+{
+ sja1000Isr(can_chanp);
+
+ return (LW_IRQ_HANDLED);
+}
+
+/********************************************************************************************************
+ ** 函数名称: can_setreg
+ ** 功能描述: CAN寄存器设置
+ ** 输 入 : can_chanp 设备
+ ** reg 寄存器偏移值
+ ** val 设置的值
+ ** 输 出 : NONE
+ ** 全局变量:
+ ** 调用模块:
+ ********************************************************************************************************/
+static void can_setreg(SJA1000_CHAN *can_chanp, int reg, UINT8 val)
+{
+ can_dev_t *priv = can_chanp->priv;
+
+ write8(val, (priv->virt_base + reg));
+}
+
+/********************************************************************************************************
+ ** 函数名称: can_getreg
+ ** 功能描述: CAN寄存器取值
+ ** 输 入 : can_chanp 设备
+ ** reg 寄存器偏移值
+ ** 输 出 : 寄存器值
+ ** 全局变量:
+ ** 调用模块:
+ ********************************************************************************************************/
+static UINT8 can_getreg(SJA1000_CHAN *can_chanp, int reg)
+{
+ can_dev_t *priv = can_chanp->priv;
+
+ return (read8(priv->virt_base + reg));
+}
+
+/********************************************************************************************************
+ ** 函数名称: can_reset
+ ** 功能描述: CAN寄存器复位
+ ** 输 入 : can_chanp 设备
+ ** 输 出 : NONE
+ ** 全局变量:
+ ** 调用模块:
+ ********************************************************************************************************/
+static void can_reset(SJA1000_CHAN *can_chanp)
+{
+ can_dev_t *priv = can_chanp->priv;
+
+ SAST804_INT_CLEAR(priv->vector);
+}
+
+/********************************************************************************************************
+ ** 函数名称: can_open
+ ** 功能描述: CAN设备打开
+ ** 输 入 : can_chanp 设备
+ ** 输 出 : NONE
+ ** 全局变量:
+ ** 调用模块:
+ ********************************************************************************************************/
+static void can_open(SJA1000_CHAN *can_chanp)
+{
+ char name[64];
+ can_dev_t *priv = can_chanp->priv;
+ int channel = can_chanp->channel - 1;
+
+ snprintf(name, sizeof(name), "sja1000_%d_isr", channel);
+ API_InterVectorConnect(priv->vector,
+ (PINT_SVR_ROUTINE)can_isr,
+ (PVOID)can_chanp,
+ name);
+ API_InterVectorEnable(priv->vector);
+}
+
+/********************************************************************************************************
+ ** 函数名称: can_close
+ ** 功能描述: CAN设备关闭
+ ** 输 入 : can_chanp 设备
+ ** 输 出 : NONE
+ ** 全局变量:
+ ** 调用模块:
+ ********************************************************************************************************/
+static void can_close(SJA1000_CHAN *can_chanp)
+{
+ can_dev_t *priv = can_chanp->priv;
+
+ API_InterVectorDisable(priv->vector);
+ API_InterVectorDisconnect(priv->vector,
+ (PINT_SVR_ROUTINE)can_isr,
+ (PVOID)can_chanp);
+}
+
+/********************************************************************************************************
+ ** 函数名称: can_init
+ ** 功能描述: CAN设备创建初始化
+ ** 输 入 : NONE
+ ** 输 出 : error code
+ ** 全局变量:
+ ** 调用模块:
+ ********************************************************************************************************/
+static int can_init(void)
+{
+ char name[64];
+ int i;
+ int ret;
+ unsigned int value;
+
+ for (i = 0; i < SAST804_SJA1000_NR; i++) {
+ sja1000_chans[i].channel = i + 1;
+
+ sja1000_chans[i].setreg = can_setreg;
+ sja1000_chans[i].getreg = can_getreg;
+
+ sja1000_chans[i].reset = can_reset;
+ sja1000_chans[i].open = can_open;
+ sja1000_chans[i].close = can_close;
+
+ sja1000_chans[i].priv = &sja1000_chan_priv[i];
+
+ value = read32(0x30000004);
+ write32(value | 0x1F | 0x2B00, 0x30000004);
+ write32(value | 0x1F | 0x2B00, 0x30000008);
+ write32(value | 0x1F | 0x2B00, 0x3000000C);
+
+ ret = sja1000Init(&sja1000_chans[i]);
+ if (ret != ERROR_NONE) {
+ printk(KERN_ERR "can_init(): failed to init sja1000\n");
+ return (ret);
+ }
+
+ snprintf(name, sizeof(name), "/dev/can%d", i);
+
+ ret = canDevCreate(name, (CAN_CHAN *)&sja1000_chans[i],
+ __SJA1000_RX_FIFO_SIZE,
+ __SJA1000_TX_FIFO_SIZE);
+ if (ret != ERROR_NONE) {
+ printk(KERN_ERR "can_init(): failed to create sja1000 device\n");
+ return (ret);
+ }
+ }
+
+ return (ERROR_NONE);
+}
+
+/********************************************************************************************************
+ ** 函数名称: can_delete
+ ** 功能描述: CAN设备销毁
+ ** 输 入 : NONE
+ ** 输 出 : error code
+ ** 全局变量:
+ ** 调用模块:
+ ********************************************************************************************************/
+int can_delete(void)
+{
+ int i;
+ char name[64];
+ int ret;
+
+ for (i = 0; i < SAST804_SJA1000_NR; ++i) {
+ snprintf(name, sizeof(name), "/dev/can%d", i);
+
+ ret = canDevRemove(name, LW_FALSE);
+ if ( ret != ERROR_NONE) {
+ printk(KERN_ERR "can_delete(): can not remove %s device\r\n", name);
+
+ return (PX_ERROR);
+ }
+ }
+
+ return (ERROR_NONE);
+}
+
+/********************************************************************************************************
+ ** 函数名称: module_init
+ ** 功能描述: CAN设备内核模块加载函数
+ ** 输 入 : NONE
+ ** 输 出 : error code
+ ** 全局变量:
+ ** 调用模块:
+ ********************************************************************************************************/
+int module_init(void)
+{
+ return can_init();
+}
+
+/********************************************************************************************************
+ ** 函数名称: module_exit
+ ** 功能描述: CAN设备内核模块卸载函数
+ ** 输 入 : NONE
+ ** 输 出 : error code
+ ** 全局变量:
+ ** 调用模块:
+ ********************************************************************************************************/
+void module_exit(void)
+{
+ can_delete();
+}
diff --git a/SylixOS/kmodule/mpc750_edac/mpc750_edac.c b/SylixOS/kmodule/mpc750_edac/mpc750_edac.c
new file mode 100644
index 0000000..9bf2a19
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_edac/mpc750_edac.c
@@ -0,0 +1,412 @@
+/*********************************************************************************************************
+ **
+ ** 中国软件开源组织
+ **
+ ** 嵌入式实时操作系统
+ **
+ ** SylixOS(TM)
+ **
+ ** Copyright All Rights Reserved
+ **
+ **--------------文件信息--------------------------------------------------------------------------------
+ **
+ ** 文 件 名: mpc750_edac.c
+ **
+ ** 创 建 人: Gavin.Ba
+ **
+ ** 文件创建日期: 2019 年 02 月 22 日
+ **
+** 描 述: EDAC测试模块驱动
+ ********************************************************************************************************/
+#define __SYLIXOS_KERNEL
+#include <SylixOS.h>
+#include <module.h>
+#include <string.h>
+
+#include "mpc750_edac_com.h"
+
+typedef struct {
+ uint32_t offset;
+ uint32_t value;
+} cmd_t;
+
+/*********************************************************************************************************
+ 相关定义
+*********************************************************************************************************/
+#define SAST804_EDAC_BASE (0x30200000)
+#define SAST804_RAM_BASE (0x07F00000)
+#define SAST804_EDAC_DEV ("/dev/edac")
+
+#define EDAC_OFFSET (0x34)
+#define EDAC_1bit_ADDR (0x24)
+#define EDAC_2bit_ADDR (0x28)
+#define EDAC_1bit_CNT (0x2C)
+#define EDAC_2bit_CNT (0x30)
+
+/*********************************************************************************************************
+ 控制器类型定义
+*********************************************************************************************************/
+typedef struct {
+ LW_DEV_HDR dev_hdr;
+ LW_LIST_LINE_HEADER fdnode_header;
+
+ addr_t phy_addr_base;
+ addr_t phy_addr_size;
+ addr_t virt_addr_base;
+
+ addr_t opt_ram_base;
+
+ LW_SPINLOCK_DEFINE(slock);
+} edac_dev_t;
+
+static unsigned int edac_drv_num = 0;
+static edac_dev_t sast804_edac_dev;
+static uint32_t hm_value = 0x61;
+static uint32_t hm_msb = 0xA5A50700;
+uint32_t _version_nm = 0x20010001;
+
+/*********************************************************************************************************
+** 函数名称: edac_open
+** 功能描述: 打开 EDAC 设备
+** 输 入 : edac_devp 设备
+** namep 设备名字
+** flags 标志
+** mode 模式
+** 输 出 : 文件节点
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static long edac_open(edac_dev_t *edac_devp, char *namep, int flags, int mode)
+{
+ PLW_FD_NODE pfdnode;
+ BOOL is_new;
+
+ if ( LW_NULL == namep) {
+ errno = ERROR_IO_NO_DEVICE_NAME_IN_PATH;
+ _ErrorHandle(ERROR_IO_NO_DEVICE_NAME_IN_PATH);
+
+ return (PX_ERROR);
+ } else {
+
+ pfdnode = API_IosFdNodeAdd(&edac_devp->fdnode_header, (dev_t)edac_devp, 0,
+ flags, mode, 0, 0, 0, LW_NULL, &is_new);
+ if ( LW_NULL == pfdnode) {
+ printk(KERN_ERR "edac_open(): failed to add EDAC fd node!\n");
+
+ return (PX_ERROR);
+ }
+
+ if ( 1 == LW_DEV_INC_USE_COUNT(&edac_devp->dev_hdr)) {
+ API_CacheDisable(DATA_CACHE);
+ return ((LONG)pfdnode);
+ }
+
+ return ((long)pfdnode);
+ }
+}
+
+/*********************************************************************************************************
+** 函数名称: edac_close
+** 功能描述: 关闭 EDAC 设备
+** 输 入 : pFdEntry 文件结构
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static int edac_close(PLW_FD_ENTRY pfdentry)
+{
+ edac_dev_t *edac_devp = (edac_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+ PLW_FD_NODE pfdnode = (PLW_FD_NODE)(pfdentry->FDENTRY_pfdnode);
+
+ if ( pfdentry && pfdnode) {
+ if ( 0 == LW_DEV_DEC_USE_COUNT(&(edac_devp->dev_hdr))) {
+ API_CacheEnable(DATA_CACHE);
+ API_IosFdNodeDec(&(edac_devp->fdnode_header), pfdnode, NULL);
+ }
+
+ return (ERROR_NONE);
+ }
+
+ return (PX_ERROR);
+}
+
+/*********************************************************************************************************
+** 函数名称: edac_ioctl
+** 功能描述: 控制 EDAC 设备
+** 输 入 : pfdentry 文件结构
+** cmd 命令
+** arg 参数
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static int edac_ioctl(PLW_FD_ENTRY pfdentry, int cmd, long arg)
+{
+ edac_dev_t *edac_devp = (edac_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+ INTREG level;
+ cmd_t *cm = (cmd_t *)arg;
+ volatile uint32_t *base = (volatile uint32_t *)edac_devp->opt_ram_base;
+ uint32_t rd_value;
+ uint32_t *bufp = (uint32_t *)arg;
+
+ switch (cmd) {
+
+ case EDAC_CHECK_1bit:
+ LW_SPIN_LOCK_QUICK(&edac_devp->slock, &level);
+
+ /* 进入测试模式 */
+ //write32(hm_msb | hm_value, edac_devp->virt_addr_base + EDAC_OFFSET);
+ write32(0xA5A50761, edac_devp->virt_addr_base + EDAC_OFFSET);
+ //cm->value = read32(edac_devp->virt_addr_base + EDAC_OFFSET);
+
+ /* 修改写入地址上的值,改一位 */
+ //write32(0x3, edac_devp->opt_ram_base + cm->offset);
+ *(base + cm->offset) = 0x3;
+ //API_CacheInvalidate(DATA_CACHE, base, 4 * 1024);
+ //API_CacheFlush(DATA_CACHE, base, 4 * 1024);
+
+ /* 读该地址上的值,如果不变,测试成功 */
+ //rd_value = read32(edac_devp->opt_ram_base + cm->offset);
+ //rd_value = *(base + cm->offset);
+ write32(0xA5A50000, edac_devp->virt_addr_base + EDAC_OFFSET);
+ //API_CacheFlush(DATA_CACHE, base, 1 * 1024);
+ //API_CacheInvalidate(DATA_CACHE, base, 1 * 1024);
+ cm->value = *(base + cm->offset);
+
+// if ( rd_value != 0x1) {
+// //cm->value = (rd_value<<8) | 0xF;
+//
+// /* 退出测试模式 */
+// write32(hm_msb & 0xFFFF0000, edac_devp->virt_addr_base + EDAC_OFFSET);
+//
+// LW_SPIN_UNLOCK_QUICK(&edac_devp->slock, level);
+//
+// return (PX_ERROR);
+// } else {
+// cm->value = (rd_value<<8) | 0x1;
+// }
+
+ /* 退出测试模式 */
+ //write32(hm_msb & 0xFFFF0000, edac_devp->virt_addr_base + EDAC_OFFSET);
+ //write32(0xA5A50000, edac_devp->virt_addr_base + EDAC_OFFSET);
+
+ LW_SPIN_UNLOCK_QUICK(&edac_devp->slock, level);
+
+ break;
+
+ case EDAC_CHECK_2bits:
+ LW_SPIN_LOCK_QUICK(&edac_devp->slock, &level);
+
+ /* 进入测试模式 */
+ write32(hm_msb | hm_value, edac_devp->virt_addr_base + EDAC_OFFSET);
+
+ /* 修改写入地址上的值,改两位 */
+ //write32(0x3, edac_devp->opt_ram_base + cm->offset);
+ *(base + cm->offset) = 0x2;
+
+ /* 读该地址上的值,如果不变,测试成功 */
+ //rd_value = read32(edac_devp->opt_ram_base + cm->offset);
+ rd_value = *(base + cm->offset);
+
+ if ( rd_value != 0x1) {
+ cm->value = 0xF;
+ } else {
+ cm->value = 0x1;
+ }
+
+ /* 退出测试模式 */
+ write32(hm_msb & 0xFFFF0000, edac_devp->virt_addr_base + EDAC_OFFSET);
+
+ LW_SPIN_UNLOCK_QUICK(&edac_devp->slock, level);
+
+ break;
+
+ case EDAC_READ:
+ LW_SPIN_LOCK_QUICK(&edac_devp->slock, &level);
+
+ //cm->value = read32(edac_devp->opt_ram_base + cm->offset);
+ cm->value = *(base + cm->offset);
+
+ LW_SPIN_UNLOCK_QUICK(&edac_devp->slock, level);
+
+ break;
+
+ case EDAC_WRITE:
+ LW_SPIN_LOCK_QUICK(&edac_devp->slock, &level);
+
+ //write32(cm->value, edac_devp->opt_ram_base + cm->offset);
+ //cm->value = read32(edac_devp->opt_ram_base + cm->offset);
+ *(base + cm->offset) = cm->value;
+ //cm->value = *(base + cm->offset);
+
+ LW_SPIN_UNLOCK_QUICK(&edac_devp->slock, level);
+
+ break;
+
+ case EDAC_STAT:
+ LW_SPIN_LOCK_QUICK(&edac_devp->slock, &level);
+
+// *(bufp + 0x0) = read32(edac_devp->virt_addr_base + EDAC_1bit_ADDR);
+// *(bufp + 0x4) = read32(edac_devp->virt_addr_base + EDAC_2bit_ADDR);
+// *(bufp + 0x8) = read32(edac_devp->virt_addr_base + EDAC_1bit_CNT);
+// *(bufp + 0xC) = read32(edac_devp->virt_addr_base + EDAC_2bit_CNT);
+ bufp[0] = read32(edac_devp->virt_addr_base + EDAC_1bit_ADDR);
+ bufp[1] = read32(edac_devp->virt_addr_base + EDAC_2bit_ADDR);
+ bufp[2] = read32(edac_devp->virt_addr_base + EDAC_1bit_CNT);
+ bufp[3] = read32(edac_devp->virt_addr_base + EDAC_2bit_CNT);
+// printk(KERN_ERR "%X\r\n", read32(edac_devp->virt_addr_base + EDAC_1bit_ADDR));
+// printk(KERN_ERR "%X\r\n", read32(edac_devp->virt_addr_base + EDAC_2bit_ADDR));
+// printk(KERN_ERR "%X\r\n", read32(edac_devp->virt_addr_base + EDAC_1bit_CNT));
+// printk(KERN_ERR "%X\r\n", read32(edac_devp->virt_addr_base + EDAC_2bit_CNT));
+
+ LW_SPIN_UNLOCK_QUICK(&edac_devp->slock, level);
+
+ break;
+
+ case EDAC_CHANGE_HM:
+ hm_value = (uint32_t)arg;
+ break;
+
+ default:
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: edac_write
+** 功能描述: 驱动 write 函数
+** 输 入 : pfdentry
+** bufp 写缓冲
+** len 写数据长度
+** 输 出 : 成功写入数据字节数量
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static ssize_t edac_write(PLW_FD_ENTRY pfdentry, void *bufp, size_t len)
+{
+
+ return (len);
+}
+
+/*********************************************************************************************************
+** 函数名称: edac_read
+** 功能描述: 驱动 read 函数
+** 输 入 :
+** 输 出 : 成功读取数据字节数量
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static ssize_t edac_read(PLW_FD_ENTRY pfdentry, void *bufp, size_t len)
+{
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: edac_drv
+** 功能描述: 安装 EDAC 驱动
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+int edac_drv(void)
+{
+ struct file_operations filops;
+
+ if ( edac_drv_num) {
+
+ return (ERROR_NONE);
+ }
+
+ lib_memset(&filops, 0, sizeof(struct file_operations));
+
+ filops.owner = THIS_MODULE;
+ filops.fo_create = edac_open;
+ filops.fo_open = edac_open;
+ filops.fo_close = edac_close;
+ filops.fo_ioctl = edac_ioctl;
+ filops.fo_write = edac_write;
+ filops.fo_read = edac_read;
+
+ edac_drv_num = iosDrvInstallEx2(&filops, LW_DRV_TYPE_NEW_1);
+
+ DRIVER_LICENSE(edac_drv_num, "Dual BSD/GPL->Ver 1.0");
+ DRIVER_AUTHOR(edac_drv_num, "Gavin.Bai");
+ DRIVER_DESCRIPTION(edac_drv_num, "VOTE driver.");
+
+ return (edac_drv_num > 0) ? (ERROR_NONE) : (PX_ERROR);
+}
+
+/*********************************************************************************************************
+** 函数名称: edac_devadd
+** 功能描述: 创建 EDAC 设备
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+int edac_devadd(void)
+{
+ edac_dev_t *edac_devp;
+
+ edac_devp = &sast804_edac_dev;
+
+ edac_devp->phy_addr_base = SAST804_EDAC_BASE;
+ edac_devp->phy_addr_size = LW_CFG_VMM_PAGE_SIZE;
+ edac_devp->virt_addr_base = SAST804_EDAC_BASE;
+ edac_devp->opt_ram_base = SAST804_RAM_BASE;
+
+ LW_SPIN_INIT(&edac_devp->slock);
+
+ if ( ERROR_NONE != API_IosDevAddEx(&edac_devp->dev_hdr, SAST804_EDAC_DEV, edac_drv_num, DT_CHR)) {
+ printk(KERN_ERR "edac_devadd(): can not add EDAC device : %s.\n", strerror(errno));
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: module_init
+** 功能描述: 内核模块加载函数
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+int module_init(void)
+{
+ if ( edac_drv()) {
+ printk(KERN_ERR "module_init(): can not add EDAC device driver : %s.\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ if ( edac_devadd()) {
+ printk(KERN_ERR "module_init(): can not add EDAC device: %s\r\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: module_exit
+** 功能描述: 内核模块卸载函数
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+void module_exit(void)
+{
+ iosDevFileAbnormal(&(sast804_edac_dev.dev_hdr));
+
+ iosDevDelete(&(sast804_edac_dev.dev_hdr));
+
+ iosDrvRemove(edac_drv_num, TRUE);
+}
diff --git a/SylixOS/kmodule/mpc750_edac/mpc750_edac_com.h b/SylixOS/kmodule/mpc750_edac/mpc750_edac_com.h
new file mode 100644
index 0000000..232ef18
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_edac/mpc750_edac_com.h
@@ -0,0 +1,20 @@
+/*
+ * mpc750_edac_com.h
+ *
+ * Created on: Feb 22, 2019
+ * Author: Gavin.Bai
+ */
+
+#ifndef SRC_MPC750_EDAC_COM_H_
+#define SRC_MPC750_EDAC_COM_H_
+
+#include <sys/ioccom.h>
+
+#define EDAC_CHECK_1bit _IOW('x', 238, int) /* EDAC测试所用命令 */
+#define EDAC_READ _IOW('x', 239, int)
+#define EDAC_WRITE _IOW('x', 240, int)
+#define EDAC_CHECK_2bits _IOW('x', 241, int)
+#define EDAC_CHANGE_HM _IOW('x', 242, int)
+#define EDAC_STAT _IOW('x', 243, int)
+
+#endif /* SRC_MPC750_EDAC_COM_H_ */
diff --git a/SylixOS/kmodule/mpc750_encrypt/mpc750_encrypt.c b/SylixOS/kmodule/mpc750_encrypt/mpc750_encrypt.c
new file mode 100644
index 0000000..4393790
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_encrypt/mpc750_encrypt.c
@@ -0,0 +1,720 @@
+/*********************************************************************************************************
+ **
+ ** 中国软件开源组织
+ **
+ ** 嵌入式实时操作系统
+ **
+ ** SylixOS(TM)
+ **
+ ** Copyright All Rights Reserved
+ **
+ **--------------文件信息--------------------------------------------------------------------------------
+ **
+ ** 文 件 名: mpc750_encrypt.c
+ **
+ ** 创 建 人: Gavin.Bai
+ **
+ ** 文件创建日期: 2019 年 02 月 28 日
+ **
+** 描 述 : 星间加解密驱动
+ ********************************************************************************************************/
+
+#define __SYLIXOS_KERNEL
+#include <SylixOS.h>
+#include <module.h>
+#include <string.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include "mpc750_encrypt_com.h"
+
+#define ENCRYPT_BUF_SIZE (0x400)
+
+/*********************************************************************************************************
+ * 调试宏
+*********************************************************************************************************/
+#ifndef __DEBUG_PRINTF
+#define __DEBUG_PRINTF (1)
+#endif /*__DEBUG_PRINTF */
+
+/*********************************************************************************************************
+ * 宏信息
+*********************************************************************************************************/
+#define SAST804_ENCRYPT_BASE (0x30000000)
+#define SAST804_ENCRYPT_BUF_BASE (0x10008000)
+#define SAST804_ENCRYPT_DEV ("/dev/encrypt")
+#define SAST804_ENCRYPT_VECTOR (17)
+
+#define DATA_CMD (0x11)
+#define CTRL_CMD (0x22)
+
+#define SWITCH_OFF_1 (0x4)
+#define SWITCH_OFF_2 (0x8)
+#define SWITCH_OFF_3 (0xC)
+
+#define SWITCH_HIGH (0x1)
+#define SWITCH_LOW (0x0)
+
+#define SWITCH_INDEX (0x5)
+
+/*********************************************************************************************************
+ * 发送寄存器偏移量
+*********************************************************************************************************/
+#define DAT_TX_OFFSET (0x180)
+#define CTL_TX_OFFSET (0x1A0)
+
+#define TX_STATUS_OFFSET (0x0)
+#define TX_START_OFFSET (0x4)
+#define TX_REST_OFFSET (0x8)
+
+#define DAT_TX_BUF_OFFSET (0x0)
+#define CTL_TX_BUF_OFFSET (0x800)
+
+/*********************************************************************************************************
+ * 接收寄存器定义
+*********************************************************************************************************/
+#define DAT_RX_OFFSET (0x190)
+#define CTL_RX_OFFSET (0x1B0)
+
+#define RX_CNT_OFFSET (0x0)
+#define RX_CLR_OFFSET (0x4)
+#define RX_TIMEOUT_OFFSET (0x8)
+
+#define DAT_RX_BUF_OFFSET (0x400)
+
+#define CTL_RX_BUF_OFFSET (0xC00)
+
+#define TX_BUSY (0x1)
+#define RX_BUSY (0x1)
+#define CLR_FLAG (0x55AA)
+#define RST_FLAG (0x55AA)
+
+
+#define QUEUE_CNT_MAX (10)
+#define QUEUE_DATA_SIZE (266)
+#define QUEUE_SIZE_MAX (QUEUE_CNT_MAX * QUEUE_DATA_SIZE)
+
+#define DATA_HI (0xEB)
+#define DATA_LO (0x90)
+
+#define SAST804_INT_STATUS_REG (0x30300000)
+#define SAST804_INT_CLEAR(vector) write32(1 << vector, SAST804_INT_STATUS_REG)
+
+/*********************************************************************************************************
+ ENCRYPT 控制器类型定义
+*********************************************************************************************************/
+
+typedef struct {
+ uint32_t counter;
+ uint32_t max;
+ uint32_t free;
+ uint8_t *in;
+ uint8_t *out;
+ uint8_t *base;
+} encrypt_queue_t;
+
+typedef struct {
+ LW_DEV_HDR dev_hdr;
+ LW_LIST_LINE_HEADER fdnode_header;
+
+ addr_t phy_addr_base;
+ addr_t phy_addr_size;
+ addr_t virt_addr_base;
+
+ addr_t buf_base;
+
+ LW_HANDLE lock;
+
+ ULONG vector;
+
+ LW_SPINLOCK_DEFINE (slock);
+
+ LW_SEL_WAKEUPLIST selwul_list; /* select() 等待链 */
+
+ encrypt_queue_t queue_data;
+} encrypt_dev_t;
+typedef encrypt_dev_t *pencrypt_dev_t;
+
+static uint8_t queue_data_buf[QUEUE_SIZE_MAX];
+
+/*********************************************************************************************************
+ ENCRYPT 设备驱动个数
+*********************************************************************************************************/
+static uint32_t encrypt_drv_num = 0;
+
+/*********************************************************************************************************
+ ENCRYPT 设备实例化
+*********************************************************************************************************/
+static encrypt_dev_t sast804_encrypt_dev;
+
+uint32_t _version_nm = 0x20010001;
+
+static irqreturn_t encrypt_isr(encrypt_dev_t *pdev, ULONG vector)
+{
+ INTREG intreg;
+ uint32_t count;
+ int32_t pos_now;
+ uint8_t buf[QUEUE_DATA_SIZE];
+ uint8_t *bufp = (uint8_t *)buf;
+
+ lib_memset(buf, 0x0, sizeof(buf));
+
+ LW_SPIN_LOCK_QUICK(&pdev->slock, &intreg);
+
+ if ( read32(pdev->virt_addr_base + DAT_RX_OFFSET + RX_TIMEOUT_OFFSET) & (0x1<<31)) {
+ count = read32(pdev->virt_addr_base + DAT_RX_OFFSET + RX_CNT_OFFSET); /* 读取数据个数 */
+ count = min(count, QUEUE_DATA_SIZE);
+
+ pos_now = 0;
+ while ( pos_now < count) { /* 读取数据 */
+ *bufp++ = read8(pdev->buf_base + DAT_RX_BUF_OFFSET + pos_now);
+ pos_now++;
+ }
+
+ write32(CLR_FLAG, pdev->virt_addr_base + DAT_RX_OFFSET + RX_CLR_OFFSET); /* 接收计数清零 */
+
+ if ( (QUEUE_DATA_SIZE == count) && (DATA_HI == buf[0] && DATA_LO == buf[1])) {
+ lib_memcpy(pdev->queue_data.in, buf, sizeof(uint8_t) * QUEUE_DATA_SIZE);
+ pdev->queue_data.in += QUEUE_DATA_SIZE;
+ pdev->queue_data.counter++;
+ pdev->queue_data.free--;
+
+ if ( QUEUE_DATA_SIZE == (pdev->queue_data.in - pdev->queue_data.base)) {
+ pdev->queue_data.in = pdev->queue_data.base;
+ }
+
+ SEL_WAKE_UP_ALL(&pdev->selwul_list, SELREAD);
+ }
+ }
+
+ write32(0x0, pdev->virt_addr_base + DAT_RX_OFFSET + RX_TIMEOUT_OFFSET); /* 清除接收标志 */
+
+ SAST804_INT_CLEAR(pdev->vector);
+
+ LW_SPIN_UNLOCK_QUICK(&pdev->slock, intreg);
+
+
+ return (LW_IRQ_HANDLED);
+}
+
+/*********************************************************************************************************
+** 函数名称: tx_cmd
+** 功能描述: 发送星间加解密板数据
+** 输 入 : buf 数据缓存
+** len 长度
+** base_addr 基地址
+** tx_addr 发送缓存地址
+** 输 出 : 发送成功返回长度,否则返回-1
+*********************************************************************************************************/
+static int32_t tx_cmd(uint8_t *buf, int32_t len, addr_t base_addr, addr_t tx_addr)
+{
+ uint32_t end, need_send;
+ uint8_t *bufp = buf;
+ size_t i;
+ uint32_t retry = 0;
+
+ end = ENCRYPT_BUF_SIZE;
+ need_send = 0x0;
+
+ do {
+ retry = 0;
+ while ( read32(base_addr + TX_STATUS_OFFSET) & TX_BUSY) { /* 确保上一次发送已经完成 */
+ ++retry;
+ if ( 100000 == retry) {
+ return (PX_ERROR);
+ }
+ }
+
+ if (len > end) { /* 计算需要发送的数据长度 */
+ need_send = end;
+ len -= end;
+ } else {
+ need_send = len;
+ len = 0;
+ }
+
+ for (i = 0; i < need_send; ++i) { /* 数据拷贝 */
+ write8(*bufp++, tx_addr + i);
+ }
+
+ write32(need_send, base_addr + TX_START_OFFSET); /* 开始发送 */
+
+ retry = 0;
+ while ( read32(base_addr + TX_STATUS_OFFSET) & TX_BUSY) { /* 确保上发送完成 */
+ ++retry;
+ if ( 100000 == retry) {
+ return (PX_ERROR);
+ }
+ }
+ } while (len);
+
+ return (0);
+}
+
+/*********************************************************************************************************
+** 函数名称: rx_cmd
+** 功能描述: 接收信道关口板返回数据
+** 输 入 : buf 数据缓存
+** len 长度
+** base_addr 基地址
+** rx_addr 接收缓存地址
+** 输 出 : 采集成功返回长度,否则返回-1
+*********************************************************************************************************/
+static int32_t rx_cmd(uint8_t *buf, int32_t len, addr_t base_addr, addr_t rx_addr)
+{
+ uint32_t count;
+ int32_t pos_now;
+ uint8_t *bufp = (uint8_t *)buf;
+
+ count = read32(base_addr + RX_CNT_OFFSET); /* 读取数据个数 */
+ count = min(count, len);
+
+ pos_now = 0;
+ while ( pos_now < count) { /* 读取数据 */
+ *bufp++ = read8(rx_addr + pos_now);
+ pos_now++;
+ }
+
+ write32(CLR_FLAG, base_addr + RX_CLR_OFFSET); /* 接收计数清零 */
+
+ return (count);
+}
+
+/*********************************************************************************************************
+** 函数名称: __selEncryptAdd
+** 功能描述:
+** 输 入 :
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static void __selEncryptAdd (encrypt_dev_t *devp, long arg)
+{
+ REGISTER PLW_SEL_WAKEUPNODE pselnode = (PLW_SEL_WAKEUPNODE)arg;
+
+ SEL_WAKE_NODE_ADD(&devp->selwul_list, pselnode); /* 添加节点 */
+
+ switch (pselnode->SELWUN_seltypType) {
+
+ case SELREAD:
+
+ break;
+ default:
+
+ printk("other select type-%d\r\n", pselnode->SELWUN_seltypType);
+ }
+}
+
+/*********************************************************************************************************
+** 函数名称: __selEncryptDelete
+** 功能描述:
+** 输 入 :
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static void __selEncryptDelete(encrypt_dev_t *devp, long arg)
+{
+ SEL_WAKE_NODE_DELETE(&devp->selwul_list, (PLW_SEL_WAKEUPNODE)arg);
+}
+
+/*********************************************************************************************************
+** 函数名称: encrypt_open
+** 功能描述: 打开 ENCRYPT 设备
+** 输 入 : encrypt_devp 设备
+** namep 设备名字
+** flags 标志
+** mode 模式
+** 输 出 : 文件节点
+*********************************************************************************************************/
+static long encrypt_open(encrypt_dev_t *encrypt_devp, char *namep, int flags, int mode)
+{
+ PLW_FD_NODE pfdnode;
+ BOOL is_new;
+ char name[64];
+
+ if ( LW_NULL == namep) {
+ errno = ERROR_IO_NO_DEVICE_NAME_IN_PATH;
+ _ErrorHandle(ERROR_IO_NO_DEVICE_NAME_IN_PATH);
+
+ return (PX_ERROR);
+ } else {
+ pfdnode = API_IosFdNodeAdd(&encrypt_devp->fdnode_header, (dev_t)encrypt_devp, 0,
+ flags, mode, 0, 0, 0, LW_NULL, &is_new);
+ if ( LW_NULL == pfdnode) {
+ printk(KERN_ERR "encrypt_open(): failed to add ENCRYPT fd node\r\n");
+
+ return (PX_ERROR);
+ }
+
+ if ( 1 == LW_DEV_INC_USE_COUNT(&encrypt_devp->dev_hdr)) {
+
+ /**
+ ** 数据通道发送复位,设置发送为空闲
+ ** */
+ write32(RST_FLAG, encrypt_devp->virt_addr_base + DAT_TX_OFFSET + TX_REST_OFFSET);
+
+ /**
+ ** 控制通道发送复位,设置发送为空闲
+ ** */
+ write32(RST_FLAG, encrypt_devp->virt_addr_base + CTL_TX_OFFSET + TX_REST_OFFSET);
+
+ /**
+ ** 数据通道接收清零,清空缓冲,置计数为零
+ ** */
+ write32(CLR_FLAG, encrypt_devp->virt_addr_base + DAT_RX_OFFSET + RX_CLR_OFFSET);
+ write32(CLR_FLAG, encrypt_devp->virt_addr_base + CTL_RX_OFFSET + RX_CLR_OFFSET);
+ write32(0x0, encrypt_devp->virt_addr_base + DAT_RX_OFFSET + RX_TIMEOUT_OFFSET);
+
+ /**
+ ** 使能SRAM允许
+ ** */
+ write32(0x1, 0x300000F8);
+
+ encrypt_devp->lock = API_SemaphoreMCreate("encrypt_lock",
+ LW_PRIO_DEF_CEILING, LW_OPTION_WAIT_PRIORITY |
+ LW_OPTION_INHERIT_PRIORITY | LW_OPTION_DELETE_SAFE |
+ LW_OPTION_OBJECT_GLOBAL, LW_NULL);
+ if ( LW_OBJECT_HANDLE_INVALID == encrypt_devp->lock) {
+ printk(KERN_ERR "encrypt_open(): failed to create lock\r\n");
+
+ LW_DEV_DEC_USE_COUNT(&(encrypt_devp->dev_hdr));
+ API_IosFdNodeDec(&(encrypt_devp->fdnode_header), pfdnode, NULL);
+
+ return (PX_ERROR);
+ }
+
+ snprintf(name, sizeof(name), "encrypt_rx_isr");
+ API_InterVectorConnect(encrypt_devp->vector,
+ (PINT_SVR_ROUTINE)encrypt_isr,
+ (PVOID)encrypt_devp,
+ name);
+ API_InterVectorEnable(encrypt_devp->vector);
+
+ return ((long) pfdnode);
+ }
+
+ return ((long) pfdnode);
+ }
+}
+
+/*********************************************************************************************************
+** 函数名称: encrypt_close
+** 功能描述: 关闭 ENCRYPT 设备
+** 输 入 : pFdEntry 文件结构
+** 输 出 : ERROR_CODE
+*********************************************************************************************************/
+static int encrypt_close(PLW_FD_ENTRY pfdentry)
+{
+ PLW_FD_NODE pfdnode = (PLW_FD_NODE)(pfdentry->FDENTRY_pfdnode);
+ pencrypt_dev_t pencryptdev = (pencrypt_dev_t)pfdentry->FDENTRY_pdevhdrHdr;
+
+ if ( pfdentry && pfdnode) {
+ if ( 0 == LW_DEV_DEC_USE_COUNT(&(pencryptdev->dev_hdr))) {
+ API_SemaphoreMDelete(&pencryptdev->lock);
+ API_InterVectorDisable(pencryptdev->vector);
+ API_IosFdNodeDec(&(pencryptdev->fdnode_header), pfdnode, NULL);
+ }
+
+ return (ERROR_NONE);
+ } else {
+ return (PX_ERROR);
+ }
+}
+
+/*********************************************************************************************************
+** 函数名称: encrypt_ioctl
+** 功能描述: 控制 ENCRYPT 设备
+** 输 入 : pfdentry 文件结构
+** cmd 命令
+** arg 参数
+** 输 出 : ERROR_CODE
+*********************************************************************************************************/
+static int encrypt_ioctl(PLW_FD_ENTRY pfdentry, int cmd, long arg)
+{
+ encrypt_dev_t *encrypt_devp = (encrypt_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+ uint32_t tmp = (uint32_t )arg;
+ uint32_t value;
+
+ switch ( cmd) {
+
+ case ENCRYPT_SWITCH:
+ API_SemaphoreMPend(encrypt_devp->lock, LW_OPTION_WAIT_INFINITE);
+ value = read32(encrypt_devp->virt_addr_base + SWITCH_OFF_1);
+
+ value |= (0x2B << 8);
+
+ if ( SWITCH_HIGH == tmp) {
+ value |= (0x1 << SWITCH_INDEX);
+ } else if ( SWITCH_LOW == tmp) {
+ value &= ~(0x1 << SWITCH_INDEX);
+ } else {
+ printk(KERN_ERR "encrypt_ioctl(): argument is not 1 or 0\r\n");
+
+ API_SemaphoreMPost(encrypt_devp->lock);
+
+ return (PX_ERROR);
+ }
+
+ write32(value, encrypt_devp->virt_addr_base + SWITCH_OFF_1);
+ write32(value, encrypt_devp->virt_addr_base + SWITCH_OFF_2);
+ write32(value, encrypt_devp->virt_addr_base + SWITCH_OFF_3);
+
+ API_SemaphoreMPost(encrypt_devp->lock);
+
+ break;
+
+ case FIOSELECT: /* tm FIOSELECT 处理 */
+ __selEncryptAdd(encrypt_devp, arg);
+ break;
+
+ case FIOUNSELECT: /* tm FIOUNSELECT 处理 */
+ __selEncryptDelete(encrypt_devp, arg);
+ break;
+
+ default:
+ printk(KERN_ERR "encrypt_ioctl(): command is invalid\r\n");
+
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: encrypt_write
+** 功能描述: 驱动 write 函数
+** 输 入 : pfdentry
+** bufp 写缓冲
+** len 写数据长度
+** 输 出 : 成功写入数据字节数量
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static ssize_t encrypt_write(PLW_FD_ENTRY pfdentry, void *bufp, size_t len)
+{
+ int32_t ret;
+ uint8_t *data = (uint8_t *)bufp;
+ encrypt_dev_t *encrypt_devp = (encrypt_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+
+ if ( len > ENCRYPT_BUF_SIZE) {
+ printk(KERN_ERR "encrypt_write(): length to be written is longger than %X\r\n",
+ ENCRYPT_BUF_SIZE);
+
+ return (PX_ERROR);
+ }
+
+ API_SemaphoreMPend(encrypt_devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ switch (data[0]) {
+
+ case DATA_CMD:
+ ret = tx_cmd(data + 1, len, encrypt_devp->virt_addr_base + DAT_TX_OFFSET,
+ encrypt_devp->buf_base + DAT_TX_BUF_OFFSET);
+ if ( ret < 0) {
+ printk(KERN_ERR "encrypt_write(): write datagram fail\r\n");
+
+ API_SemaphoreMPost(encrypt_devp->lock);
+
+ return (PX_ERROR);
+ }
+ break;
+
+ case CTRL_CMD:
+ ret = tx_cmd(data + 1, len, encrypt_devp->virt_addr_base + CTL_TX_OFFSET,
+ encrypt_devp->buf_base + CTL_TX_BUF_OFFSET);
+ if ( ret < 0) {
+ printk(KERN_ERR "encrypt_write(): write ctrl data fail\r\n");
+
+ API_SemaphoreMPost(encrypt_devp->lock);
+
+ return (PX_ERROR);
+ }
+ break;
+
+ default:
+ API_SemaphoreMPost(encrypt_devp->lock);
+
+ return (PX_ERROR);
+ }
+
+ API_SemaphoreMPost(encrypt_devp->lock);
+
+ return (0);
+}
+
+/*********************************************************************************************************
+** 函数名称: encrypt_read
+** 功能描述: 驱动 read 函数
+** 输 入 :
+** 输 出 : 成功读取数据字节数量
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static ssize_t encrypt_read(PLW_FD_ENTRY pfdentry, void *bufp, size_t len)
+{
+ int32_t ret;
+ uint8_t *data = (uint8_t *)bufp;
+ encrypt_dev_t *encrypt_devp = (encrypt_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+
+ if ( !bufp) {
+ return (PX_ERROR);
+ }
+
+ API_SemaphoreMPend(encrypt_devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ switch (data[0]) {
+
+ case DATA_CMD:
+ if ( encrypt_devp->queue_data.counter > 0) {
+ lib_memcpy(bufp, encrypt_devp->queue_data.out, QUEUE_DATA_SIZE * sizeof(uint8_t));
+ encrypt_devp->queue_data.counter--;
+ encrypt_devp->queue_data.out += QUEUE_DATA_SIZE;
+
+ if ( QUEUE_DATA_SIZE == (encrypt_devp->queue_data.out-encrypt_devp->queue_data.base)) {
+ encrypt_devp->queue_data.out = encrypt_devp->queue_data.base;
+ }
+ ret = QUEUE_DATA_SIZE;
+ } else {
+ ret = 0;
+ }
+
+ break;
+
+ case CTRL_CMD:
+ ret = rx_cmd(bufp, len, encrypt_devp->virt_addr_base + CTL_RX_OFFSET,
+ encrypt_devp->buf_base + CTL_RX_BUF_OFFSET);
+ if ( ret < 0) {
+
+ API_SemaphoreMPost(encrypt_devp->lock);
+
+ return (PX_ERROR);
+ }
+ break;
+
+ default:
+ API_SemaphoreMPost(encrypt_devp->lock);
+
+ return (PX_ERROR);
+ }
+
+ API_SemaphoreMPost(encrypt_devp->lock);
+
+ return (ret);
+}
+
+/*********************************************************************************************************
+** 函数名称: encrypt_drv
+** 功能描述: 安装 GWS 驱动
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static int encrypt_drv(void)
+{
+ struct file_operations filops;
+
+ if ( encrypt_drv_num) {
+
+ return (ERROR_NONE);
+ }
+
+ lib_memset(&filops, 0, sizeof(struct file_operations));
+
+ filops.owner = THIS_MODULE;
+ filops.fo_create = encrypt_open;
+ filops.fo_open = encrypt_open;
+ filops.fo_close = encrypt_close;
+ filops.fo_ioctl = encrypt_ioctl;
+ filops.fo_write = encrypt_write;
+ filops.fo_read = encrypt_read;
+
+ encrypt_drv_num = iosDrvInstallEx2(&filops, LW_DRV_TYPE_NEW_1);
+
+ DRIVER_LICENSE(encrypt_drv_num, "Dual BSD/GPL->Ver 1.0");
+ DRIVER_AUTHOR(encrypt_drv_num, "Gavin.Bai");
+ DRIVER_DESCRIPTION(encrypt_drv_num, "ENCRYPT driver.");
+
+ return (encrypt_drv_num > 0) ? (ERROR_NONE) : (PX_ERROR);
+}
+
+/*********************************************************************************************************
+** 函数名称: encrypt_devadd
+** 功能描述: 创建 ENCRYPT 设备
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static int encrypt_devadd(void)
+{
+ encrypt_dev_t *encrypt_devp;
+
+ encrypt_devp = &sast804_encrypt_dev;
+
+ encrypt_devp->phy_addr_base = SAST804_ENCRYPT_BASE;
+ encrypt_devp->phy_addr_size = LW_CFG_VMM_PAGE_SIZE;
+ encrypt_devp->virt_addr_base = SAST804_ENCRYPT_BASE;
+ encrypt_devp->vector = SAST804_ENCRYPT_VECTOR;
+ encrypt_devp->buf_base = SAST804_ENCRYPT_BUF_BASE;
+
+ SEL_WAKE_UP_LIST_INIT(&encrypt_devp->selwul_list);
+ LW_SPIN_INIT(&encrypt_devp->slock);
+
+ lib_memset(queue_data_buf, 0x0, sizeof(queue_data_buf));
+
+ encrypt_devp->queue_data.counter = 0;
+ encrypt_devp->queue_data.max = QUEUE_CNT_MAX;
+ encrypt_devp->queue_data.free = QUEUE_CNT_MAX;
+ encrypt_devp->queue_data.in = queue_data_buf;
+ encrypt_devp->queue_data.out = queue_data_buf;
+ encrypt_devp->queue_data.base = queue_data_buf;
+
+ if ( ERROR_NONE != API_IosDevAddEx(&encrypt_devp->dev_hdr, SAST804_ENCRYPT_DEV, encrypt_drv_num, DT_CHR)) {
+ printk(KERN_ERR "encrypt_devadd(): can not add ENCRYPT device : %s.\n", strerror(errno));
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: module_init
+** 功能描述: 内核模块加载函数
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+int module_init(void)
+{
+ if ( encrypt_drv()) {
+ printk(KERN_ERR "module_init(): can not add ENCRYPT device driver: %s.\r\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ if ( encrypt_devadd()) {
+ printk(KERN_ERR "module_init(): can not add ENCRYPT device: %s\r\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: module_exit
+** 功能描述: 内核模块卸载函数
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+void module_exit(void)
+{
+ iosDevFileAbnormal(&(sast804_encrypt_dev.dev_hdr));
+ iosDevDelete(&(sast804_encrypt_dev.dev_hdr));
+ iosDrvRemove(encrypt_drv_num, TRUE);
+}
diff --git a/SylixOS/kmodule/mpc750_encrypt/mpc750_encrypt_com.h b/SylixOS/kmodule/mpc750_encrypt/mpc750_encrypt_com.h
new file mode 100644
index 0000000..024c4c6
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_encrypt/mpc750_encrypt_com.h
@@ -0,0 +1,15 @@
+/*
+ * mpc750_encrypt_com.h
+ *
+ * Created on: Mar 2, 2019
+ * Author: Gavin.Bai
+ */
+
+#ifndef SRC_MPC750_ENCRYPT_COM_H_
+#define SRC_MPC750_ENCRYPT_COM_H_
+
+#include <sys/ioccom.h>
+
+#define ENCRYPT_SWITCH _IOW('x', 250, int)
+
+#endif /* SRC_MPC750_ENCRYPT_COM_H_ */
diff --git a/SylixOS/kmodule/mpc750_gps_tick/mpc750_gps_tick.c b/SylixOS/kmodule/mpc750_gps_tick/mpc750_gps_tick.c
new file mode 100644
index 0000000..ec074f6
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_gps_tick/mpc750_gps_tick.c
@@ -0,0 +1,382 @@
+/*********************************************************************************************************
+ **
+ ** 中国软件开源组织
+ **
+ ** 嵌入式实时操作系统
+ **
+ ** SylixOS(TM)
+ **
+ ** Copyright All Rights Reserved
+ **
+ **--------------文件信息--------------------------------------------------------------------------------
+ **
+ ** 文 件 名: mpc750_tm.c
+ **
+ ** 创 建 人: Gavin.Bai
+ **
+ ** 文件创建日期: 2018 年 09 月 20 日
+ **
+ ** 描 述: GPS second interrupt 驱动
+ ********************************************************************************************************/
+
+#define __SYLIXOS_KERNEL
+#define __SYLIXOS_STDIO
+#include <SylixOS.h>
+#include <module.h>
+#include <string.h>
+
+/*********************************************************************************************************
+ GPS秒中断 相关定义
+*********************************************************************************************************/
+#define SAST804_GPS_VECTOR (21)
+#define SAST804_GPS_BASE (0x30000000)
+#define SAST804_GPS_DEV ("/dev/GPS1")
+
+#define SAST804_INT_STATUS_REG (0x30300000)
+#define SAST804_INT_CLEAR(vector) write32(1 << vector, SAST804_INT_STATUS_REG)
+
+/*********************************************************************************************************
+ GPS秒中断 控制器类型定义
+*********************************************************************************************************/
+typedef struct {
+ LW_DEV_HDR dev_hdr;
+ LW_LIST_LINE_HEADER fdnode_header;
+// addr_t phy_addr_base;
+// addr_t phy_addr_size;
+// addr_t virt_addr_base;
+ ULONG vector;
+
+ LW_SPINLOCK_DEFINE (slock);
+
+ LW_SEL_WAKEUPLIST selwul_list; /* select() 等待链 */
+} gps_dev_t;
+
+static UINT32 gps_drv_num = 0;
+static gps_dev_t sast804_gps_dev;
+static UINT32 _G_gps_isr_cnt = 0;
+uint32_t _version_nm = 0x20010001;
+
+/*********************************************************************************************************
+** 函数名称: gps_isr
+** 功能描述: GPS设备中断服务函数
+** 输 入 : gps_devp 设备
+** vector 中断矢量
+** 输 出 : 中断执行结果
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static irqreturn_t gps_isr(gps_dev_t *gps_devp, ULONG vector)
+{
+ INTREG intreg;
+
+
+ LW_SPIN_LOCK_QUICK(&gps_devp->slock, &intreg);
+ SAST804_INT_CLEAR(vector);
+ _G_gps_isr_cnt++;
+ SEL_WAKE_UP_ALL(&gps_devp->selwul_list, SELREAD);
+
+ LW_SPIN_UNLOCK_QUICK(&gps_devp->slock, intreg);
+
+ return (LW_IRQ_HANDLED);
+}
+
+/*********************************************************************************************************
+** 函数名称: gps_open
+** 功能描述: 打开 GPS 设备
+** 输 入 : gps_devp 设备
+** namep 设备名字
+** flags 标志
+** mode 模式
+** 输 出 : 文件节点
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static long gps_open(gps_dev_t *gps_devp, char *namep, int flags, int mode)
+{
+ PLW_FD_NODE pfdnode;
+ BOOL is_new;
+ char cName[64];
+
+ if ( LW_NULL == namep) {
+ errno = ERROR_IO_NO_DEVICE_NAME_IN_PATH;
+ _ErrorHandle(ERROR_IO_NO_DEVICE_NAME_IN_PATH);
+
+ return (PX_ERROR);
+ } else {
+ pfdnode = API_IosFdNodeAdd(&gps_devp->fdnode_header,
+ (dev_t)gps_devp, 0, flags, mode, 0, 0, 0, LW_NULL, &is_new);
+ if ( LW_NULL == pfdnode) {
+ printk(KERN_ERR "gps_open(): failed to add GPS fd node!\n");
+
+ return (PX_ERROR);
+ }
+
+ if ( 1 == LW_DEV_INC_USE_COUNT(&gps_devp->dev_hdr)) {
+ snprintf(cName, sizeof(cName), "gps_tick_isr");
+ API_InterVectorConnect(gps_devp->vector,
+ (PINT_SVR_ROUTINE)gps_isr,
+ (PVOID)gps_devp,
+ cName);
+ API_InterVectorEnable(gps_devp->vector);
+
+ return ((LONG)pfdnode);
+ }
+ return ((long)pfdnode);
+ }
+}
+
+/*********************************************************************************************************
+** 函数名称: gps_close
+** 功能描述: 关闭 GPS 设备
+** 输 入 : pfdentry 文件结构
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static int gps_close(PLW_FD_ENTRY pfdentry)
+{
+ gps_dev_t *gps_devp = (gps_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+ PLW_FD_NODE pfdnode = (PLW_FD_NODE)pfdentry->FDENTRY_pfdnode;
+
+ if ( pfdentry && pfdnode) {
+ if ( LW_DEV_DEC_USE_COUNT(&gps_devp->dev_hdr) == 0) {
+
+ API_InterVectorDisable(gps_devp->vector);
+ API_IosFdNodeDec(&gps_devp->fdnode_header, pfdnode, LW_NULL);
+ }
+
+ return (ERROR_NONE);
+ }
+
+ return (PX_ERROR);
+}
+
+/*********************************************************************************************************
+** 函数名称: gps_write
+** 功能描述: 驱动 write 函数,
+** 输 入 : pfdentry
+** bufp 写缓冲
+** len 写数据长度
+** 输 出 : 成功写入数据字节数量
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static ssize_t gps_write(PLW_FD_ENTRY pfdentry, void *bufp, size_t len)
+{
+
+ return (0);
+}
+
+/*********************************************************************************************************
+** 函数名称: gps_read
+** 功能描述: 驱动 read 函数
+** 输 入 :
+** 输 出 : 成功读取数据字节数量
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static ssize_t gps_read(PLW_FD_ENTRY pfdentry, void *bufp, size_t len)
+{
+ UINT32 *pValue = (UINT32 *)bufp; INTREG level;
+
+ if ( !pfdentry || !bufp) {
+ _ErrorHandle(EINVAL);
+
+ return (PX_ERROR);
+ }
+
+ if ( !len) {
+ return (0);
+ }
+
+ API_InterLock(&level);
+ *pValue = _G_gps_isr_cnt;
+ API_InterUnlock(level);
+
+ return (sizeof(UINT32));
+}
+
+/*********************************************************************************************************
+** 函数名称: __selGpsAdd
+** 功能描述:
+** 输 入 :
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static void __selGpsAdd (gps_dev_t *gps_devp, long arg)
+{
+ REGISTER PLW_SEL_WAKEUPNODE pselnode = (PLW_SEL_WAKEUPNODE)arg;
+
+ SEL_WAKE_NODE_ADD(&gps_devp->selwul_list, pselnode); /* 添加节点 */
+
+ switch (pselnode->SELWUN_seltypType) {
+
+ case SELREAD:
+
+ break;
+ default:
+
+ printk("other select type-%d\r\n", pselnode->SELWUN_seltypType);
+ }
+}
+
+/*********************************************************************************************************
+** 函数名称: __selGpsDelete
+** 功能描述:
+** 输 入 :
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static void __selGpsDelete(gps_dev_t *gps_devp, long arg)
+{
+ SEL_WAKE_NODE_DELETE(&gps_devp->selwul_list, (PLW_SEL_WAKEUPNODE)arg);
+}
+
+/*********************************************************************************************************
+** 函数名称: gps_ioctl
+** 功能描述: 设备 GPS 控制函数
+** 输 入 :
+** 输 出 : error_code
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static int gps_ioctl(PLW_FD_ENTRY pfdentry, int cmd, long arg)
+{
+ gps_dev_t *gps_devp = (gps_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+
+ switch (cmd) {
+
+ case FIOSELECT: /* tm FIOSELECT 处理 */
+ __selGpsAdd(gps_devp, arg);
+ return (ERROR_NONE);
+ break;
+
+ case FIOUNSELECT: /* tm FIOUNSELECT 处理 */
+ __selGpsDelete(gps_devp, arg);
+ break;
+
+ default:
+ errno = ENOSYS;
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: gps_drv
+** 功能描述: 安装 GPS 驱动
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+int gps_drv(void)
+{
+ struct file_operations fileop;
+
+ if ( gps_drv_num) {
+ return (ERROR_NONE);
+ }
+
+ lib_memset(&fileop, 0, sizeof(struct file_operations));
+
+ fileop.owner = THIS_MODULE;
+ fileop.fo_create = gps_open;
+ fileop.fo_open = gps_open;
+ fileop.fo_close = gps_close;
+ fileop.fo_ioctl = gps_ioctl;
+ fileop.fo_write = gps_write;
+ fileop.fo_read = gps_read;
+
+ gps_drv_num = iosDrvInstallEx2(&fileop, LW_DRV_TYPE_NEW_1);
+
+ DRIVER_LICENSE(gps_drv_num, "Dual BSD/GPL->Ver 1.0");
+ DRIVER_AUTHOR(gps_drv_num, "Gavin.Bai");
+ DRIVER_DESCRIPTION(gps_drv_num, "GPS driver.");
+
+ return (gps_drv_num > 0) ? (ERROR_NONE) : (PX_ERROR);
+}
+
+/*********************************************************************************************************
+** 函数名称: gps_devadd
+** 功能描述: 创建 GPS 设备
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+int gps_devadd(void)
+{
+ gps_dev_t *gps_devp;
+
+ gps_devp = &sast804_gps_dev;
+
+ gps_devp->vector = SAST804_GPS_VECTOR;
+
+ SEL_WAKE_UP_LIST_INIT(&gps_devp->selwul_list);
+
+ LW_SPIN_INIT(&gps_devp->slock);
+
+ if ( ERROR_NONE != API_IosDevAddEx(&gps_devp->dev_hdr, SAST804_GPS_DEV, gps_drv_num, DT_CHR)) {
+ printk(KERN_ERR "gps_devadd(): can not add GPS device : %s.\n", strerror(errno));
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: module_init
+** 功能描述: 内核模块加载函数
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+int module_init(void)
+{
+ if ( gps_drv()) {
+ printk(KERN_ERR "module_init(): add device driver for GPS fail: %s\r\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ if ( gps_devadd()) {
+ printk(KERN_ERR "module_init(): add device GPS fail: %s\r\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: module_exit
+** 功能描述: 内核模块卸载函数
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+void module_exit(void)
+{
+ if ( LW_DEV_GET_USE_COUNT(&sast804_gps_dev.dev_hdr)) {
+ _DebugHandle(__ERRORMESSAGE_LEVEL, "too many open files.\r\n");
+ _ErrorHandle(EBUSY);
+ }
+
+ if ( SEL_WAKE_UP_LIST_LEN(&sast804_gps_dev.selwul_list) > 0) {
+ errno = EBUSY;
+ }
+
+ iosDevFileAbnormal(&(sast804_gps_dev.dev_hdr));
+
+ iosDevDelete(&(sast804_gps_dev.dev_hdr));
+
+ iosDrvRemove(gps_drv_num, TRUE);
+
+ SEL_WAKE_UP_LIST_TERM(&sast804_gps_dev.selwul_list);
+}
diff --git a/SylixOS/kmodule/mpc750_gws/mpc750_gws.c b/SylixOS/kmodule/mpc750_gws/mpc750_gws.c
new file mode 100644
index 0000000..34a1332
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_gws/mpc750_gws.c
@@ -0,0 +1,715 @@
+/*********************************************************************************************************
+ **
+ ** 中国软件开源组织
+ **
+ ** 嵌入式实时操作系统
+ **
+ ** SylixOS(TM)
+ **
+ ** Copyright All Rights Reserved
+ **
+ **--------------文件信息--------------------------------------------------------------------------------
+ **
+ ** 文 件 名: mpc750_gws.c
+ **
+ ** 创 建 人: Gavin.Bai(白亮)
+ **
+ ** 文件创建日期: 2019 年 02 月 15 日
+ **
+** 描 述 : 信道关口驱动
+ ********************************************************************************************************/
+
+#define __SYLIXOS_KERNEL
+#include <SylixOS.h>
+#include <module.h>
+#include <string.h>
+
+#include "mpc750_gws_com.h"
+
+#define TCTM_BUF_SIZE (32)
+
+typedef enum {
+ A_MACHINE = 0x00,
+ B_MACHINE = 0x1FF,
+
+ GWA_CHANNEL = 0x3,
+ GWB_CHANNEL = 0x4,
+} APID_e;
+
+typedef enum _cmd_function_flag {
+ TM_GROUP_COLLECT_CMD = 0xAAAA
+} cmd_function_flag_e;
+
+typedef enum _cmd_code {
+ TM_GROUP_COLLECT_CODE = 0xAAAA
+} cmd_code_e;
+
+#pragma pack(1)
+typedef struct _pkg_identify {
+ uint8_t version : 3;
+ uint8_t type : 1;
+ uint8_t minor : 1;
+ uint16_t identify : 11;
+} pkg_identify_t, *ppkg_identify_t;
+#pragma pack()
+
+#pragma pack(1)
+typedef struct _pkg_seq_ctrl {
+ uint8_t seq_flag : 2;
+ uint16_t counter : 14;
+} pkg_seq_ctrl_t, *ppkg_seq_ctrl_t;
+#pragma pack()
+
+#pragma pack(1)
+typedef struct _pkg_length {
+ uint16_t length;
+} pkg_length_t, *ppkg_length_t;
+#pragma pack()
+
+#pragma pack(1)
+typedef struct _pkg_data {
+ uint8_t app_data[TCTM_BUF_SIZE];
+} pkg_data_t, *ppkg_data_t;
+#pragma pack()
+
+#pragma pack(1)
+typedef struct _pkg_leading_header {
+ pkg_identify_t pkg_identify;
+ pkg_seq_ctrl_t pkg_seq_ctrl;
+ pkg_length_t pkg_length;
+} pkg_leading_header_t, *ppkg_leading_header_t;
+#pragma pack()
+
+#pragma pack(1)
+typedef struct _tm_request {
+ pkg_leading_header_t leading_header;
+ pkg_data_t data;
+} tm_request_t, *ptm_request_t;
+#pragma pack()
+
+/*********************************************************************************************************
+ * 调试宏
+*********************************************************************************************************/
+#ifndef __DEBUG_PRINTF
+#define __DEBUG_PRINTF (1)
+#endif /*__DEBUG_PRINTF */
+
+/*********************************************************************************************************
+ * 设备信息
+*********************************************************************************************************/
+#define SAST804_GWS_BASE (0x30000030)
+#define SAST804_GWS_DEV ("/dev/gws")
+
+/*********************************************************************************************************
+ * 发送寄存器偏移量
+*********************************************************************************************************/
+#define TX_STATUS_OFFSET (0x0)
+#define TX_START_OFFSET (0x4)
+#define TX_REST_OFFSET (0x8)
+#define TX_BUFFER (0x10000800)
+
+/*********************************************************************************************************
+ 寄存器定义
+*********************************************************************************************************/
+#define RX_A_CNT_OFFSET (0x20)
+#define RX_A_CLR_OFFSET (0x24)
+#define RX_A_BUFFER (0x10001000)
+
+#define RX_B_CNT_OFFSET (0x30)
+#define RX_B_CLR_OFFSET (0x34)
+#define RX_B_BUFFER (0x10001400)
+
+#define TX_BUSY (0x1)
+#define RX_BUSY (0x1)
+#define CLR_FLAG (0x55AA)
+#define RST_FLAG (0x55AA)
+
+#define RETRY_MAX_TIMES (1000)
+
+
+/*********************************************************************************************************
+ GWS 控制器类型定义
+*********************************************************************************************************/
+typedef struct {
+ LW_DEV_HDR dev_hdr;
+ LW_LIST_LINE_HEADER fdnode_header;
+ addr_t phy_addr_base;
+ addr_t phy_addr_size;
+ addr_t virt_addr_base;
+
+ addr_t tx_buf_base;
+ addr_t rx_buf_a_base;
+ addr_t rx_buf_b_base;
+
+ LW_HANDLE lock;
+} gws_dev_t;
+typedef gws_dev_t *pgws_dev_t;
+
+/*********************************************************************************************************
+ GWS 设备驱动个数
+*********************************************************************************************************/
+static unsigned int gws_drv_num = 0;
+
+/*********************************************************************************************************
+ GWS 设备实例化
+*********************************************************************************************************/
+static gws_dev_t sast804_gws_dev;
+
+static tm_request_t tm_request_A;
+static tm_request_t tm_request_B;
+
+static uint32_t uart_tx_buf_size[5] = {
+ 0,
+ 0,
+ 0,
+ 128,
+ 128 };
+
+uint32_t _version_nm = 0x20010101;
+
+/*********************************************************************************************************
+** 函数名称: calc_chksum16
+** 功能描述: 计算校验值
+** 输 入 : pbuf 数据缓冲区
+** mach 数据长度
+** 输 出 : 返回计算结果
+*********************************************************************************************************/
+static uint16_t calc_chksum16(const void *pbuf, int32_t len)
+{
+ int32_t i;
+ uint16_t chk = 0;
+ uint16_t *pdata = (uint16_t *) pbuf;
+
+ if ( len <= 0) {
+ return (chk);
+ }
+
+ for (i = 0; i <= (len / 2); ++i) {
+ chk ^= *pdata;
+ pdata++;
+ }
+
+ return (chk);
+}
+
+/*********************************************************************************************************
+** 函数名称: init_tm_request
+** 功能描述: 准备遥测群采请求
+** 输 入 : pobject 通道对象
+** mach 机器标识符
+** 输 出 : 准备成功返回0,否则返回-1
+*********************************************************************************************************/
+static int32_t init_tm_request(ptm_request_t pobject, APID_e mach)
+{
+ pobject->leading_header.pkg_identify.version = 0x0;
+ pobject->leading_header.pkg_identify.type = 0x1;
+ pobject->leading_header.pkg_identify.minor = 0x0;
+
+ pobject->leading_header.pkg_seq_ctrl.seq_flag = 0x3;
+ pobject->leading_header.pkg_seq_ctrl.counter = 0x0;
+
+ pobject->leading_header.pkg_length.length = 0x5;
+
+ switch (mach) {
+
+ case A_MACHINE:
+ pobject->leading_header.pkg_identify.identify = A_MACHINE;
+ bzero(pobject->data.app_data, sizeof(uint8_t) * TCTM_BUF_SIZE);
+ break;
+
+ case B_MACHINE:
+ pobject->leading_header.pkg_identify.identify = B_MACHINE;
+ bzero(pobject->data.app_data, sizeof(uint8_t) * TCTM_BUF_SIZE);
+ break;
+
+ default:
+ bzero(pobject, sizeof(tm_request_t));
+
+ return (PX_ERROR);
+ }
+
+ return (0);
+}
+
+/*********************************************************************************************************
+** 函数名称: init_tm_function
+** 功能描述: 准备发送功能标识符和命令字
+** 输 入 : pobject 通道对象
+** func 功能标识符
+** code 命令字
+** 输 出 : 准备成功返回0,否则返回-1
+*********************************************************************************************************/
+static int32_t init_tm_function(ptm_request_t pobject, cmd_function_flag_e func, cmd_code_e code)
+{
+ uint16_t chk = 0;
+
+ switch (func) {
+
+ case TM_GROUP_COLLECT_CMD:
+ if ( TM_GROUP_COLLECT_CODE == code) {
+ pobject->data.app_data[0] = (func >> 8) & 0xFF;
+ pobject->data.app_data[1] = (func >> 0) & 0xFF;
+ pobject->data.app_data[2] = (code >> 8) & 0xFF;
+ pobject->data.app_data[3] = (code >> 0) & 0xFF;
+ chk = calc_chksum16(pobject->data.app_data, 2);
+ pobject->data.app_data[4] = (chk >> 8) & 0xFF;
+ pobject->data.app_data[5] = (chk >> 0) & 0xFF;
+ } else {
+
+ return (PX_ERROR);
+ }
+
+ break;
+
+ default:
+
+ return (PX_ERROR);
+ }
+
+ return (0);
+}
+
+/*********************************************************************************************************
+** 函数名称: tx_cmd
+** 功能描述: 发送信道关口板遥测群采数据
+** 输 入 : chanel 通道号
+** buf 数据缓存
+** len 长度
+** base_addr 基地址
+** tx_addr 发送缓存地址
+** 输 出 : 发送成功返回长度,否则返回-1
+*********************************************************************************************************/
+static int32_t tx_cmd(uint32_t channel, uint8_t *buf, int32_t len, addr_t base_addr, addr_t tx_addr)
+{
+ uint32_t end, need_send;
+ size_t i;
+ uint8_t *bufp = buf;
+ uint32_t retry = 0;
+
+ if ( channel >= 5) {
+ return (-1);
+ }
+
+ end = uart_tx_buf_size[channel];
+ need_send = 0x0;
+
+ do {
+ retry = 0;
+ while ( read32(base_addr + TX_STATUS_OFFSET) & TX_BUSY) { /* 确保上一次发送已经完成 */
+ ++retry;
+ if ( 100000 == retry) {
+ return (PX_ERROR);
+ }
+ }
+
+ if ( len > end) { /* 计算需要发送的数据长度 */
+ need_send = end;
+ len -= end;
+ } else {
+ need_send = len;
+ len = 0;
+ }
+
+ for (i = 0; i < need_send; ++i) { /* 数据拷贝 */
+ write8(*bufp++, tx_addr + i);
+ }
+
+ write32(need_send, base_addr + TX_START_OFFSET); /* 开始发送 */
+
+ retry = 0;
+ while ( read32(base_addr + TX_STATUS_OFFSET) & TX_BUSY) { /* 确保上发送完成 */
+ ++retry;
+ if ( 100000 == retry) {
+ return (PX_ERROR);
+ }
+ }
+ } while (len);
+
+ return (0);
+}
+
+/*********************************************************************************************************
+** 函数名称: rx_cmd
+** 功能描述: 接收信道关口板返回数据
+** 输 入 : chanel 通道号
+** buf 数据缓存
+** len 长度
+** base_addr 基地址
+** rx_addr 接收缓存地址
+** 输 出 : 采集成功返回长度,否则返回-1
+*********************************************************************************************************/
+static int32_t rx_cmd(uint32_t channel, uint8_t *buf, int32_t len, addr_t base_addr, addr_t rx_addr)
+{
+ uint32_t count;
+ uint32_t regs;
+ int32_t pos_now;
+ uint8_t *bufp = (uint8_t *)buf;
+ uint32_t rx_cnt;
+ uint32_t rx_clr;
+ uint32_t retry_times = 0;
+
+ if ( channel >= 5) {
+ return (PX_ERROR);
+ }
+
+ if ( GWA_CHANNEL == channel) {
+ rx_cnt = base_addr + RX_A_CNT_OFFSET;
+ rx_clr = base_addr + RX_A_CLR_OFFSET;
+ } else if ( GWB_CHANNEL == channel) {
+ rx_cnt = base_addr + RX_B_CNT_OFFSET;
+ rx_clr = base_addr + RX_B_CLR_OFFSET;
+ } else {
+ return (PX_ERROR);
+ }
+
+ regs = read32(rx_cnt); /* 读取数据个数 */
+ count = min(regs, len);
+
+ pos_now = 0;
+ while ( pos_now < count) { /* 读取数据 */
+ *bufp++ = read8(rx_addr + pos_now);
+ pos_now++;
+ }
+
+ write32(CLR_FLAG, rx_clr); /* 接收计数清零 */
+
+ return (count);
+}
+
+/*********************************************************************************************************
+** 函数名称: collect_cmd
+** 功能描述: 准备遥测群采请求指令并发送
+** 输 入 : pobject 通道对象
+** channel 通道号
+** mach 机器标识
+** base_addr 基地址
+** tx_addr 发送缓存地址
+** 输 出 : 文件节点
+*********************************************************************************************************/
+static int32_t collect_cmd(ptm_request_t pobject, uint32_t channel, APID_e mach, addr_t base_addr, addr_t tx_addr)
+{
+ uint8_t tmp[12];
+
+ if ( init_tm_request(pobject, mach) < 0) {
+
+ return (PX_ERROR);
+ }
+
+ if ( init_tm_function(pobject, TM_GROUP_COLLECT_CMD, TM_GROUP_COLLECT_CODE) < 0) {
+
+ return (PX_ERROR);
+ }
+
+ memcpy(tmp, &(pobject->leading_header), sizeof(pkg_leading_header_t));
+ memcpy(tmp + sizeof(pkg_leading_header_t), pobject->data.app_data, sizeof(uint8_t) * 6);
+
+ if ( tx_cmd(channel, tmp, 12, base_addr, tx_addr) < 0) {
+
+ return (PX_ERROR);
+ }
+
+ return (0);
+}
+
+/*********************************************************************************************************
+** 函数名称: gws_open
+** 功能描述: 打开 GWS 设备
+** 输 入 : gws_devp 设备
+** namep 设备名字
+** flags 标志
+** mode 模式
+** 输 出 : 文件节点
+*********************************************************************************************************/
+static long gws_open(gws_dev_t *gws_devp, char *namep, int flags, int mode)
+{
+ PLW_FD_NODE pfdnode;
+ BOOL is_new;
+
+ if ( LW_NULL == namep) {
+ errno = ERROR_IO_NO_DEVICE_NAME_IN_PATH;
+ _ErrorHandle(ERROR_IO_NO_DEVICE_NAME_IN_PATH);
+
+ return (PX_ERROR);
+ } else {
+ pfdnode = API_IosFdNodeAdd(&gws_devp->fdnode_header, (dev_t)gws_devp, 0,
+ flags, mode, 0, 0, 0, LW_NULL, &is_new);
+ if ( LW_NULL == pfdnode) {
+ printk(KERN_ERR "gws_open(): failed to add gws fd node\r\n");
+
+ return (PX_ERROR);
+ }
+
+ if ( 1 == LW_DEV_INC_USE_COUNT(&gws_devp->dev_hdr)) {
+ bzero(&tm_request_A, sizeof(tm_request_A));
+ bzero(&tm_request_B, sizeof(tm_request_B));
+
+ /**
+ ** 发送复位,设置发送为空闲
+ ** */
+ write32(RST_FLAG, gws_devp->virt_addr_base + TX_REST_OFFSET);
+
+ /*
+ ** 接收清零,清空缓冲,置计数为零
+ ** */
+ write32(CLR_FLAG, gws_devp->virt_addr_base + RX_A_CLR_OFFSET);
+ write32(CLR_FLAG, gws_devp->virt_addr_base + RX_B_CLR_OFFSET);
+
+ write32(0x1, 0x300000F8);
+
+ gws_devp->lock = API_SemaphoreMCreate("gws_lock", LW_PRIO_DEF_CEILING, LW_OPTION_WAIT_PRIORITY |
+ LW_OPTION_INHERIT_PRIORITY | LW_OPTION_DELETE_SAFE |
+ LW_OPTION_OBJECT_GLOBAL, LW_NULL);
+ if ( LW_OBJECT_HANDLE_INVALID == gws_devp->lock) {
+
+ LW_DEV_DEC_USE_COUNT(&(gws_devp->dev_hdr));
+ API_IosFdNodeDec(&(gws_devp->fdnode_header), pfdnode, NULL);
+
+ return (PX_ERROR);
+ }
+
+ return ((long)pfdnode);
+ }
+
+ return ((long)pfdnode);
+ }
+}
+
+/*********************************************************************************************************
+** 函数名称: gws_close
+** 功能描述: 关闭 GWS 设备
+** 输 入 : pFdEntry 文件结构
+** 输 出 : ERROR_CODE
+*********************************************************************************************************/
+static int gws_close(PLW_FD_ENTRY pfdentry)
+{
+ PLW_FD_NODE pfdnode = (PLW_FD_NODE)(pfdentry->FDENTRY_pfdnode);
+ pgws_dev_t pgwsdev = (pgws_dev_t)pfdentry->FDENTRY_pdevhdrHdr;
+
+ if ( pfdentry && pfdnode) {
+ if ( 0 == LW_DEV_DEC_USE_COUNT(&(pgwsdev->dev_hdr))) {
+ API_SemaphoreMDelete(&pgwsdev->lock);
+ API_IosFdNodeDec(&(pgwsdev->fdnode_header), pfdnode, NULL);
+ }
+
+ return (ERROR_NONE);
+ } else {
+ return (PX_ERROR);
+ }
+}
+
+/*********************************************************************************************************
+** 函数名称: gws_ioctl
+** 功能描述: 控制 GWS 设备
+** 输 入 : pfdentry 文件结构
+** cmd 命令
+** arg 参数
+** 输 出 : ERROR_CODE
+*********************************************************************************************************/
+static int gws_ioctl(PLW_FD_ENTRY pfdentry, int cmd, long arg)
+{
+ gws_dev_t *gws_devp = (gws_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+ uint32_t rx_len = 0;
+ uint8_t bufp[44];
+ int32_t ret;
+
+ switch (cmd) {
+
+ case GWS_A_TM :
+ /* 获取信道关口A板遥测 */
+ API_SemaphoreMPend(gws_devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ ret = collect_cmd(&tm_request_A, GWA_CHANNEL, A_MACHINE,
+ gws_devp->virt_addr_base, gws_devp->tx_buf_base);
+ if ( ret < 0) {
+ API_SemaphoreMPost(gws_devp->lock);
+
+ return (-1);
+ }
+ usleep(5000);
+ rx_len = rx_cmd(GWA_CHANNEL, bufp, TCTM_BUF_SIZE, gws_devp->virt_addr_base, gws_devp->rx_buf_a_base);
+ if ( rx_len < 0) {
+ API_SemaphoreMPost(gws_devp->lock);
+ return (-1);
+ }
+
+ if ( 22 == rx_len) {
+ memcpy((uint8_t *) arg, bufp, sizeof(uint8_t) * rx_len);
+ } else {
+ rx_len = 0;
+ }
+
+ API_SemaphoreMPost(gws_devp->lock);
+
+ return (rx_len);
+ break;
+
+ case GWS_B_TM :
+ /* 获取信道关口B板遥测 */
+ API_SemaphoreMPend(gws_devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ ret = collect_cmd(&tm_request_B, GWB_CHANNEL, B_MACHINE,
+ gws_devp->virt_addr_base, gws_devp->tx_buf_base);
+ if ( ret < 0) {
+ API_SemaphoreMPost(gws_devp->lock);
+
+ return (-1);
+ }
+ usleep(5000);
+ rx_len = rx_cmd(GWB_CHANNEL, bufp, TCTM_BUF_SIZE, gws_devp->virt_addr_base, gws_devp->rx_buf_b_base);
+ if ( rx_len < 0 ) {
+ API_SemaphoreMPost(gws_devp->lock);
+ return (-1);
+ }
+ if ( 22 == rx_len) {
+ memcpy((uint8_t *) arg, bufp, sizeof(uint8_t) * rx_len);
+ } else {
+ rx_len = 0;
+ }
+
+ API_SemaphoreMPost(gws_devp->lock);
+
+ return (rx_len);
+ break;
+
+ default:
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: gws_write
+** 功能描述: 驱动 write 函数
+** 输 入 : pfdentry
+** bufp 写缓冲
+** len 写数据长度
+** 输 出 : 成功写入数据字节数量
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static ssize_t gws_write(PLW_FD_ENTRY pfdentry, void *bufp, size_t len)
+{
+
+ return (0);
+}
+
+/*********************************************************************************************************
+** 函数名称: gws_read
+** 功能描述: 驱动 read 函数
+** 输 入 :
+** 输 出 : 成功读取数据字节数量
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static ssize_t gws_read(PLW_FD_ENTRY pfdentry, void *bufp, size_t len)
+{
+
+ return (0);
+}
+
+/*********************************************************************************************************
+** 函数名称: gws_drv
+** 功能描述: 安装 GWS 驱动
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static int gws_drv(void)
+{
+ struct file_operations filops;
+
+ if ( gws_drv_num) {
+
+ return (ERROR_NONE);
+ }
+
+ lib_memset(&filops, 0, sizeof(struct file_operations));
+
+ filops.owner = THIS_MODULE;
+ filops.fo_create = gws_open;
+ filops.fo_open = gws_open;
+ filops.fo_close = gws_close;
+ filops.fo_ioctl = gws_ioctl;
+ filops.fo_write = gws_write;
+ filops.fo_read = gws_read;
+
+ gws_drv_num = iosDrvInstallEx2(&filops, LW_DRV_TYPE_NEW_1);
+
+ DRIVER_LICENSE(gws_drv_num, "Dual BSD/GPL->Ver 1.0");
+ DRIVER_AUTHOR(gws_drv_num, "Gavin.Bai");
+ DRIVER_DESCRIPTION(gws_drv_num, "GWS driver.");
+
+ return (gws_drv_num > 0) ? (ERROR_NONE) : (PX_ERROR);
+}
+
+/*********************************************************************************************************
+** 函数名称: gws_devadd
+** 功能描述: 创建 GWS 设备
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static int gws_devadd(void)
+{
+ gws_dev_t *gws_devp;
+
+ gws_devp = &sast804_gws_dev;
+
+ gws_devp->phy_addr_base = SAST804_GWS_BASE;
+ gws_devp->phy_addr_size = LW_CFG_VMM_PAGE_SIZE;
+ gws_devp->virt_addr_base = SAST804_GWS_BASE;
+
+ gws_devp->tx_buf_base = TX_BUFFER;
+ gws_devp->rx_buf_a_base = RX_A_BUFFER;
+ gws_devp->rx_buf_b_base = RX_B_BUFFER;
+
+ if ( ERROR_NONE != API_IosDevAddEx(&gws_devp->dev_hdr, SAST804_GWS_DEV, gws_drv_num, DT_CHR)) {
+ printk(KERN_ERR "gws_devadd(): can not add GWS device : %s.\n", strerror(errno));
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: module_init
+** 功能描述: 内核模块加载函数
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+int module_init(void)
+{
+ if ( gws_drv()) {
+ printk(KERN_ERR "module_init(): can not add GWS device driver: %s.\r\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ if ( gws_devadd()) {
+ printk(KERN_ERR "module_init(): can not add GWS device: %s\r\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: module_exit
+** 功能描述: 内核模块卸载函数
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+void module_exit(void)
+{
+ iosDevFileAbnormal(&(sast804_gws_dev.dev_hdr));
+ iosDevDelete(&(sast804_gws_dev.dev_hdr));
+ iosDrvRemove(gws_drv_num, TRUE);
+}
diff --git a/SylixOS/kmodule/mpc750_gws/mpc750_gws_com.h b/SylixOS/kmodule/mpc750_gws/mpc750_gws_com.h
new file mode 100644
index 0000000..064be83
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_gws/mpc750_gws_com.h
@@ -0,0 +1,18 @@
+/*
+ * mpc750_gws_com.h
+ *
+ * Created on: Feb 15, 2019
+ * Author: Gavin.Bai
+ */
+
+#ifndef SRC_MPC750_GWS_COM_H_
+#define SRC_MPC750_GWS_COM_H_
+
+#include <sys/ioccom.h>
+
+#define GWS_A_TM _IOW('x', 235, int) /* 获取信道关口A板遥测 */
+
+#define GWS_B_TM _IOW('x', 236, int) /* 获取信道关口B板遥测 */
+
+
+#endif /* SRC_MPC750_GWS_COM_H_ */
diff --git a/SylixOS/kmodule/mpc750_keyarea/mpc750_keyarea.c b/SylixOS/kmodule/mpc750_keyarea/mpc750_keyarea.c
new file mode 100644
index 0000000..21a6b2b
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_keyarea/mpc750_keyarea.c
@@ -0,0 +1,346 @@
+/*********************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM)
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: mpc750_keyarea.c
+**
+** 创 建 人: Gavin.Bai (白亮)
+**
+** 文件创建日期: 2018 年 02 月 21 日
+**
+** 描 述: keyarea关键数据区域驱动
+*********************************************************************************************************/
+
+#define __SYLIXOS_STDIO
+#define __SYLIXOS_KERNEL
+#include <SylixOS.h>
+#include <module.h>
+#include <string.h>
+
+#include "mpc750_keyarea_com.h"
+
+/********************************************************************************************************
+ 定义
+ ********************************************************************************************************/
+#define KEYAREA_NR (1)
+#define SAST804_KEYAREA_NAME ("/dev/keyarea")
+
+#define KEY_AREA_BUF (0x101F0000)
+#define KEY_AREA_SIZE (0x4000) /* 共16KB */
+
+/********************************************************************************************************
+ KEYAREA 控制器类型定义
+ ********************************************************************************************************/
+typedef struct {
+ LW_DEV_HDR devhdr;
+ LW_LIST_LINE_HEADER fdnode_header;
+
+ addr_t phy_addr_base;
+ addr_t phy_addr_size;
+ addr_t virt_addr_base;
+
+ LW_HANDLE lock;
+} keyarea_dev_t;
+
+/********************************************************************************************************
+ KEYAREA设备驱动个数
+ ********************************************************************************************************/
+static UINT32 keyarea_drv_num = 0;
+
+/********************************************************************************************************
+ KEYAREA设备实例化
+ ********************************************************************************************************/
+static keyarea_dev_t sast804_keyarea_dev[KEYAREA_NR];
+
+uint32_t _version_nm = 0x20010100;
+
+/********************************************************************************************************
+ ** 函数名称: keyarea_open
+ ** 功能描述: 打开 KEYAREA 设备
+ ** 输 入 : keyarea_devp 设备
+ ** namep 设备名字
+ ** flags 标志
+ ** mode 模式
+ ** 输 出 : 文件节点
+ ********************************************************************************************************/
+static long keyarea_open(keyarea_dev_t *keyarea_devp, char *namep, int flags, int mode)
+{
+ PLW_FD_NODE pfdnode;
+ BOOL is_new;
+
+ if ( LW_NULL == namep) {
+ errno = ERROR_IO_NO_DEVICE_NAME_IN_PATH;
+ _ErrorHandle(ERROR_IO_NO_DEVICE_NAME_IN_PATH);
+
+ return (PX_ERROR);
+ } else {
+ pfdnode = API_IosFdNodeAdd(&(keyarea_devp->fdnode_header),
+ (dev_t) keyarea_devp, 0, flags, mode, 0, 0, 0, LW_NULL,
+ &is_new);
+ if ( LW_NULL == pfdnode) {
+ printk(KERN_ERR "keyarea_open(): failed to add fd node\r\n");
+
+ return (PX_ERROR);
+ }
+
+ if ( 0x1 == LW_DEV_INC_USE_COUNT(&(keyarea_devp->devhdr))) {
+
+ write32(0x1, 0x300000F8);
+
+ keyarea_devp->lock = API_SemaphoreMCreate("keyarea_lock",
+ LW_PRIO_DEF_CEILING,
+ LW_OPTION_WAIT_PRIORITY | LW_OPTION_INHERIT_PRIORITY
+ | LW_OPTION_DELETE_SAFE | LW_OPTION_OBJECT_GLOBAL, NULL);
+ if ( LW_OBJECT_HANDLE_INVALID == keyarea_devp->lock) {
+ printk(KERN_ERR "keyarea_open(): create lock for keyarea device error\r\n");
+
+ LW_DEV_DEC_USE_COUNT(&(keyarea_devp->devhdr));
+ API_IosFdNodeDec(&(keyarea_devp->fdnode_header), pfdnode, NULL);
+
+ return (PX_ERROR);
+ }
+
+ return ((long) pfdnode);
+ }
+
+ return ((long) pfdnode);
+ }
+}
+
+/********************************************************************************************************
+ ** 函数名称: keyarea_close
+ ** 功能描述: 关闭 KEYAREA 设备
+ ** 输 入 : pfdentry 设备结构
+ ** 输 出 : ERROR_CODE
+ ********************************************************************************************************/
+static int keyarea_close(PLW_FD_ENTRY pfdentry)
+{
+ PLW_FD_NODE pfdnode = (PLW_FD_NODE)pfdentry->FDENTRY_pfdnode;
+ keyarea_dev_t *keyarea_devp = (keyarea_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+
+ if ( pfdentry && pfdnode) {
+
+ if ( 0x0 == LW_DEV_DEC_USE_COUNT(&(keyarea_devp->devhdr))) {
+ API_SemaphoreMDelete(&keyarea_devp->lock);
+ API_IosFdNodeDec(&(keyarea_devp->fdnode_header), pfdnode, NULL);
+ }
+
+ return (ERROR_NONE);
+ } else {
+ return (PX_ERROR);
+ }
+}
+
+/********************************************************************************************************
+ ** 函数名称: keyarea_ioctl
+ ** 功能描述: 控制 KEYAREA 设备
+ ** 输 入 : pfdentry 文件结构
+ ** cmd 命令
+ ** arg 参数
+ ** 输 出 : ERROR_CODE
+ ********************************************************************************************************/
+static int keyarea_ioctl(PLW_FD_ENTRY pfdentry, int cmd, long arg)
+{
+ keyarea_dev_t *keyarea_devp = (keyarea_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+ size_t i;
+
+ switch (cmd) {
+
+ case KEYAREA_CLEAR :
+ /* 清空关键数据区所有空间 */
+ API_SemaphoreMPend(keyarea_devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ for (i = 0; i < keyarea_devp->phy_addr_size; ++i) {
+ write8(0x0, keyarea_devp->phy_addr_base + i);
+ }
+
+ API_SemaphoreMPost(keyarea_devp->lock);
+
+ break;
+
+ default:
+ errno = ENOSYS;
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/********************************************************************************************************
+ ** 函数名称: keyarea_write
+ ** 功能描述: 驱动 write 函数
+ ** 输 入 : pfdentry 文件结构
+ ** bufp 写偏移+写缓冲
+ ** len 写数据长度
+ ** 输 出 : 成功写入数据字节数量
+ ********************************************************************************************************/
+static ssize_t keyarea_write(PLW_FD_ENTRY pfdentry, void *bufp, size_t len)
+{
+ keyarea_dev_t *keyarea_devp = (keyarea_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+ unsigned char *buf = (unsigned char *)bufp;
+ size_t i;
+ unsigned short offset = (buf[0] << 8) | buf[1];
+
+ API_SemaphoreMPend(keyarea_devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ if ( (offset + len) > keyarea_devp->phy_addr_size) {
+ printk(KERN_ERR "keyarea_write(): write lenght will exceed limit of space.\r\n");
+
+ API_SemaphoreMPost(keyarea_devp->lock);
+
+ return (PX_ERROR);
+ }
+
+
+ for (i = 0; i < len; ++i) {
+ write8(buf[i + 2], keyarea_devp->phy_addr_base + i + offset);
+ }
+
+ API_SemaphoreMPost(keyarea_devp->lock);
+
+ return (len);
+}
+
+/********************************************************************************************************
+ ** 函数名称: keyarea_read
+ ** 功能描述: 驱动 read 函数
+ ** 输 入 : fdentry -- 文件结构
+ ** bufp -- 读缓冲
+ ** len -- 读长度
+ ** 输 出 : 成功读取数据字节数量
+ ********************************************************************************************************/
+static ssize_t keyarea_read(PLW_FD_ENTRY pfdentry, void *bufp, size_t len)
+{
+ keyarea_dev_t *keyarea_devp = (keyarea_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+ unsigned char *buf = (unsigned char *)bufp;
+ unsigned short offset = (buf[0] << 8) | buf[1];
+ size_t i;
+
+ API_SemaphoreMPend(keyarea_devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ if ( (offset + len) > keyarea_devp->phy_addr_size) {
+ printk(KERN_ERR "keyarea_read(): read length will exceed limit of space\r\n");
+
+ API_SemaphoreMPost(keyarea_devp->lock);
+ return (-1);
+ }
+
+ for (i = 0; i < len; ++i) {
+ buf[i] = read8(keyarea_devp->phy_addr_base + i + offset);
+ }
+
+ API_SemaphoreMPost(keyarea_devp->lock);
+
+ return (len);
+}
+
+/********************************************************************************************************
+ ** 函数名称: keyarea_drv
+ ** 功能描述: 安装 RTC 驱动
+ ** 输 入 : NONE
+ ** 输 出 : ERROR_CODE
+ ********************************************************************************************************/
+static int keyarea_drv(void)
+{
+ struct file_operations keyarea_ops;
+
+ if ( keyarea_drv_num) {
+ return (ERROR_NONE);
+ }
+
+ lib_memcpy(&keyarea_ops, 0, sizeof(struct file_operations));
+
+ keyarea_ops.owner = THIS_MODULE;
+ keyarea_ops.fo_create = keyarea_open;
+ keyarea_ops.fo_open = keyarea_open;
+ keyarea_ops.fo_close = keyarea_close;
+ keyarea_ops.fo_ioctl = keyarea_ioctl;
+ keyarea_ops.fo_read = keyarea_read;
+ keyarea_ops.fo_write = keyarea_write;
+
+ keyarea_drv_num = API_IosDrvInstallEx2(&keyarea_ops, LW_DRV_TYPE_NEW_1);
+
+ DRIVER_LICENSE(keyarea_drv_num, "Dual BSD/GPL ->Ver1.0");
+ DRIVER_AUTHOR(keyarea_drv_num, "Gavin.Bai");
+ DRIVER_DESCRIPTION(keyarea_drv_num, "Keyarea Driver");
+
+ return (keyarea_drv_num > 0 ? (ERROR_NONE) : (PX_ERROR));
+}
+
+/********************************************************************************************************
+ ** 函数名称: keyarea_devadd
+ ** 功能描述: 创建KEYAREA设备
+ ** 输 入 : index -- KEYAREA索引
+ ** 输 出 : ERROR_CODE
+ ********************************************************************************************************/
+int keyarea_devadd(UINT32 index)
+{
+ keyarea_dev_t *keyarea_devp;
+
+ if ( index > KEYAREA_NR) {
+ printk(KERN_ERR "keyarea_devadd(): KEYAREA index invalid. \r\n");
+
+ return (PX_ERROR);
+ }
+
+ keyarea_devp = &(sast804_keyarea_dev[index]);
+ if ( 0x0 == index) {
+ keyarea_devp->phy_addr_base = KEY_AREA_BUF;
+ keyarea_devp->phy_addr_size = KEY_AREA_SIZE;
+ keyarea_devp->virt_addr_base = KEY_AREA_BUF;
+ }
+
+ if ( ERROR_NONE != API_IosDevAddEx(&(keyarea_devp->devhdr), SAST804_KEYAREA_NAME, keyarea_drv_num, DT_CHR)) {
+ printk(KERN_ERR "keyarea_devadd(): can not add device : %s.\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/********************************************************************************************************
+ ** 函数名称: module_init
+ ** 功能描述: 内核模块加载函数
+ ** 输 入 : NONE
+ ** 输 出 : ERROR_CODE
+ ********************************************************************************************************/
+int module_init (void)
+{
+ if ( keyarea_drv()) {
+ printk(KERN_ERR "module_init(): can not add KEYAREA device driver : %s.\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ if ( keyarea_devadd(0)) {
+ printk(KERN_ERR "module_init(): can not add KEYAREA device : %s.\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/********************************************************************************************************
+ ** 函数名称: module_exit
+ ** 功能描述: 内核模块卸载函数
+ ** 输 入 : NONE
+ ** 输 出 : NONE
+ ********************************************************************************************************/
+void module_exit (void)
+{
+ iosDevFileAbnormal(&(sast804_keyarea_dev[0].devhdr));
+
+ iosDevDelete(&(sast804_keyarea_dev[0].devhdr));
+
+ iosDrvRemove(keyarea_drv_num, TRUE);
+}
diff --git a/SylixOS/kmodule/mpc750_keyarea/mpc750_keyarea_com.h b/SylixOS/kmodule/mpc750_keyarea/mpc750_keyarea_com.h
new file mode 100644
index 0000000..845bfb6
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_keyarea/mpc750_keyarea_com.h
@@ -0,0 +1,29 @@
+/*******************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM)
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: mpc750_keyarea_com.h
+**
+** 创 建 人: Gavin.Bai (白亮)
+**
+** 文件创建日期: 2018 年 02 月 21 日
+**
+** 描 述: keyarea关键数据区域驱动命令声明
+*********************************************************************************************************/
+
+#ifndef SRC_MPC750_KEYAREA_COM_H_
+#define SRC_MPC750_KEYAREA_COM_H_
+
+#include <sys/ioccom.h>
+
+#define KEYAREA_CLEAR _IOW('x', 237, int) /* 清空所有关键数据区 */
+
+#endif /* SRC_MPC750_KEYAREA_COM_H_ */
diff --git a/SylixOS/kmodule/mpc750_mpi/mpc750_mpi.c b/SylixOS/kmodule/mpc750_mpi/mpc750_mpi.c
new file mode 100644
index 0000000..d382615
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_mpi/mpc750_mpi.c
@@ -0,0 +1,1110 @@
+/*********************************************************************************************************
+ **
+ ** 中国软件开源组织
+ **
+ ** 嵌入式实时操作系统
+ **
+ ** SylixOS(TM)
+ **
+ ** Copyright All Rights Reserved
+ **
+ **--------------文件信息--------------------------------------------------------------------------------
+ **
+ ** 文 件 名: mpc750_mpi.c
+ **
+ ** 创 建 人: Gavin.Ba
+ **
+ ** 文件创建日期: 2019 年 02 月 23 日
+ **
+** 描 述 : 综合接口板驱动
+ ********************************************************************************************************/
+#define __SYLIXOS_KERNEL
+#define __SYLIXOS_STDIO
+#include <SylixOS.h>
+#include <module.h>
+#include <string.h>
+#include <sys/time.h>
+
+#include "mpc750_mpi_com.h"
+
+typedef enum {
+ IO_MISC = 0x1,
+ IO_GPS = 0x2,
+ IO_GWA = 0x3,
+ IO_GWB = 0x4,
+
+ PKG_HEADER_HI = 0xEB,
+ PKG_HEADER_LO = 0x90,
+
+ TX_DA_CMD = 0x4,
+ TX_OC_CMD = 0x8,
+ REQ_UART_CMD = 0xC,
+ RET_UART_CMD = 0xD,
+ TX_UART_CMD = 0xE,
+ REQ_TM_CMD = 0x10,
+ RET_TM_CMD = 0x11,
+ TX_ZGK_BAK = 0x1F,
+
+ COM1 = 0x1,
+ COM2 = 0x2,
+ COM3 = 0x3,
+ COM4 = 0x4,
+ COM5 = 0x5,
+ COM6 = 0x6,
+ COM7 = 0x7,
+ COM8 = 0x8,
+ COM9 = 0x9
+} IO_type_e;
+
+/*********************************************************************************************************
+ * 设备信息
+*********************************************************************************************************/
+#define SAST804_MPI_BASE (0x30000010)
+#define SAST804_MPI_DEV ("/dev/mpi")
+
+#define SAST804_SYS_0_BASE (0x30000004)
+#define SAST804_SYS_1_BASE (0x30000008)
+#define SAST804_SYS_2_BASE (0x3000000C)
+
+/*********************************************************************************************************
+ * 发送寄存器偏移量
+*********************************************************************************************************/
+#define TX_STATUS_OFFSET (0x0)
+#define TX_START_OFFSET (0x4)
+#define TX_REST_OFFSET (0x8)
+
+#define TX_BUFFER (0x10000000)
+#define TX_BUF_SIZE (1024)
+
+/*********************************************************************************************************
+ 接收寄存器定义
+*********************************************************************************************************/
+#define RX_CNT_OFFSET (0x10)
+#define RX_CLR_OFFSET (0x14)
+#define RX_BUFFER (0x10000400)
+#define RX_BUF_SIZE (1024)
+
+/*********************************************************************************************************
+ 空闲寄存器定义
+*********************************************************************************************************/
+#define TX_BUSY (0x1)
+#define RX_BUSY (0x1)
+#define CLR_FLAG (0x55AA)
+#define RST_FLAG (0x55AA)
+
+#define DEL_COUNTER (0x1<<7)
+
+#define GNC_BACKUP_SIZE_MAX (128)
+#define GNC_BACKUP_BANK_SEL (0x2D)
+
+#define NEED (0x0)
+#define NOT_NEED (0x1)
+
+#define AUTO_START_422 (0x1<<7)
+#define AUTO_START_AD (0x1<<6)
+
+/*********************************************************************************************************
+ MPI 控制器类型定义
+*********************************************************************************************************/
+typedef struct {
+ LW_DEV_HDR dev_hdr;
+ LW_LIST_LINE_HEADER fdnode_header;
+ addr_t phy_addr_base;
+ addr_t phy_addr_size;
+ addr_t virt_addr_base;
+
+ addr_t tx_buf_base;
+ addr_t rx_buf_base;
+
+ int32_t tx_buf_size;
+ int32_t rx_buf_size;
+
+ LW_HANDLE lock;
+} mpi_dev_t;
+typedef mpi_dev_t *pmpi_dev_t;
+
+/*********************************************************************************************************
+ MPI 设备驱动个数
+*********************************************************************************************************/
+static unsigned int mpi_drv_num = 0;
+
+/*********************************************************************************************************
+ MPI 设备实例化
+*********************************************************************************************************/
+static mpi_dev_t sast804_mpi_dev;
+
+/*********************************************************************************************************
+ MPI 设备遥测请求正确错误计数
+*********************************************************************************************************/
+static uint8_t io_tm_right_cnt = 0;
+static uint8_t io_tm_error_cnt = 0;
+
+static uint32_t request_flag = 0;
+
+uint32_t _version_nm = 0x20010100;
+
+/*********************************************************************************************************
+** 函数名称: calc_chksum
+** 功能描述: 计算综合接口板数据格式内的校验和
+** 输 入 : buf -- 数据缓存起始地址
+** len -- 计算的数据长度
+** 输 出 : 返回校验和计算结果
+*********************************************************************************************************/
+static uint8_t calc_chksum(uint8_t *buf, int32_t len)
+{
+ unsigned char result = 0;
+ int i;
+
+ for (i = 0; i < len; ++i) {
+ result ^= *(buf + i);
+ }
+
+ return (result);
+}
+
+/*********************************************************************************************************
+** 函数名称: is_ad_data_valid
+** 功能描述: 综合接口板遥测群采AD数据是否有效
+** 输 入 : bufp -- AD数据缓冲区
+** len -- AD数据长度
+** 输 出 : 有效返回1,否则返回0
+*********************************************************************************************************/
+static int32_t is_ad_data_valid(const uint16_t *bufp, int32_t len)
+{
+ uint16_t result = 0;
+ int32_t i;
+
+ for (i = 0; i < len - 1; ++i) {
+ result ^= bufp[i];
+ }
+
+ return (result == bufp[len - 1] ? 1 : 0);
+}
+
+/*********************************************************************************************************
+** 函数名称: tx_cmd
+** 功能描述: 发送综合接口板数据
+** 输 入 : buf 数据缓存
+** len 长度
+** base_addr 基地址
+** tx_addr 发送缓存地址
+** buf_size 发送缓冲区大小
+** 输 出 : 发送成功返回长度,否则返回-1
+*********************************************************************************************************/
+static int32_t tx_cmd(uint8_t *buf, int32_t len, addr_t base_addr, addr_t tx_addr, int32_t buf_size)
+{
+ uint32_t end, need_send;
+ uint8_t *bufp = buf;
+ size_t i;
+ uint32_t *buf32 = (uint32_t *)buf;
+ uint32_t div = 0;
+ uint32_t left = 0;
+ uint32_t cnt = 0;
+ uint32_t retry = 0;
+ struct timeval tv;
+ uint64_t tv_val;
+
+// gettimeofday(&tv, NULL);
+// tv_val = tv.tv_sec * 1000000 + tv.tv_usec;
+// printk(KERN_ERR "TX-CMD: %llu\r\n", tv_val);
+ end = buf_size;
+ need_send = 0x0;
+
+ if ( !buf || !len) {
+ return (PX_ERROR);
+ }
+
+ write32(CLR_FLAG, 0x30000024); /* 发送请求之前清一次接收计数 */
+
+ do {
+ retry = 0;
+ while ( read32(base_addr + TX_START_OFFSET) & TX_BUSY) { /* 确保上一次发送已经完成 */
+ ++retry;
+ if ( 100000 == retry) {
+ return (PX_ERROR);
+ }
+ }
+
+ if ( len > end) { /* 计算需要发送的数据长度 */
+ need_send = end;
+ len -= end;
+ } else {
+ need_send = len;
+ len = 0;
+ }
+
+ div = need_send / 4;
+ left = need_send % 4;
+ cnt = 0;
+ while ( cnt < div) {
+ write32(*buf32, tx_addr + (cnt<<2));
+ ++cnt;
+ ++buf32;
+ }
+ if ( left) {
+ for (i = 0; i < left; ++i) {
+ write8(*(bufp + (cnt<<2) + i), tx_addr + (cnt<<2) + i);
+ }
+ }
+
+ write32(need_send, base_addr + TX_START_OFFSET); /* 开始发送 */
+
+ retry = 0;
+ while ( read32(base_addr + TX_STATUS_OFFSET) & TX_BUSY) { /* 确保上发送完成 */
+ ++retry;
+ if ( 100000 == retry) {
+ return (PX_ERROR);
+ }
+ }
+ } while (len);
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: rx_cmd
+** 功能描述: 接收综合接口板返回数据
+** 输 入 : buf 数据缓存
+** len 长度
+** base_addr 基地址
+** rx_addr 接收缓存地址
+** 输 出 : 采集成功返回长度,否则返回-1
+*********************************************************************************************************/
+static int32_t rx_cmd(uint8_t *buf, int32_t len, addr_t base_addr, addr_t rx_addr, int32_t buf_size)
+{
+ uint32_t count;
+ uint32_t regs;
+ int32_t pos_now;
+ uint8_t *bufp = (uint8_t *)buf;
+ uint32_t *buf32 = (uint32_t *)buf;
+ uint32_t div = 0;
+ uint32_t left = 0;
+ uint32_t i;
+
+ if ( !buf) {
+ return (PX_ERROR);
+ }
+
+ regs = read32(base_addr + RX_CNT_OFFSET); /* 读取数据个数 */
+ count = min(regs, len);
+
+ pos_now = 0;
+ div = count / 4;
+ left = count % 4;
+ while ( pos_now < div) {
+ *buf32 = read32(rx_addr + (pos_now<<2));
+ ++buf32;
+ ++pos_now;
+ }
+ if ( left) {
+ for (i = 0; i < left; ++i) {
+ *(bufp + (pos_now<<2) + i) = read8(rx_addr + (pos_now<<2) + i);
+ }
+ }
+
+ write32(CLR_FLAG, base_addr + RX_CLR_OFFSET); /* 接收计数清零 */
+
+ return (count);
+}
+
+/*********************************************************************************************************
+** 函数名称: _da_cmd
+** 功能描述: DA发送数据
+** 输 入 : channel 通道号
+** value DA电压值
+** not_add 是否计错标志
+** base 基地址
+** tx_addr 发送缓冲区基地址
+** buf_size 发送缓冲区大小
+** 输 出 : 备份成功返回ERROR_NONE,否则返回PX_ERROR
+*********************************************************************************************************/
+static int32_t _da_cmd(int32_t channel, uint16_t value, uint8_t not_add, addr_t base, addr_t tx_addr, int32_t buf_size)
+{
+ uint8_t buf[9];
+
+ buf[0] = PKG_HEADER_HI;
+ buf[1] = PKG_HEADER_LO;
+
+ buf[2] = 0x0;
+ buf[3] = 0x4;
+
+ buf[4] = TX_DA_CMD;
+
+ if ( not_add) {
+ buf[4] |= DEL_COUNTER;
+ }
+
+ buf[5] = channel % 3;
+
+ buf[6] = (value>>8) & 0xFF;
+ buf[7] = value & 0xFF;
+
+ buf[8] = calc_chksum(buf + 4, 4);
+
+ return (tx_cmd(buf, 9, base, tx_addr, buf_size));
+}
+
+/*********************************************************************************************************
+** 函数名称: _oc_cmd
+** 功能描述: OC门发送数据
+** 输 入 : channel 通道号
+** value OC门脉宽
+** not_add 是否计错标志
+** base 基地址
+** tx_addr 发送缓冲区基地址
+** buf_size 发送缓冲区大小
+** 输 出 : 备份成功返回ERROR_NONE,否则返回PX_ERROR
+*********************************************************************************************************/
+static int32_t _oc_cmd(int32_t channel, uint8_t value, uint8_t not_add, addr_t base, addr_t tx_addr, int32_t buf_size)
+{
+ uint8_t buf[9];
+
+ buf[0] = PKG_HEADER_HI;
+ buf[1] = PKG_HEADER_LO;
+
+ buf[2] = 0x0;
+ buf[3] = 0x4;
+
+ buf[4] = TX_OC_CMD;
+
+ if ( not_add) {
+ buf[4] |= DEL_COUNTER;
+ }
+
+ buf[5] = channel % 0x40;
+
+ buf[6] = value & 0xFF;
+
+ buf[7] = channel % 0x40;
+
+ buf[8] = calc_chksum(buf + 4, 4);
+
+ return (tx_cmd(buf, 9, base, tx_addr, buf_size));
+}
+
+/*********************************************************************************************************
+** 函数名称: _com_cmd
+** 功能描述: 异步422发送数据
+** 输 入 : channel 通道号
+** bufp 发送数据缓冲区
+** len 发送数据长度
+** not_add 是否计错标志
+** base 基地址
+** tx_addr 发送缓冲区基地址
+** buf_size 发送缓冲区大小
+** 输 出 : 备份成功返回ERROR_NONE,否则返回PX_ERROR
+*********************************************************************************************************/
+static int32_t _com_cmd(int32_t channel, void *bufp, int32_t len, uint8_t not_add, addr_t base, addr_t tx_addr, int32_t buf_size)
+{
+ uint8_t buf[519];
+
+ if ( len > 512) {
+ return (-1);
+ }
+
+ buf[0] = PKG_HEADER_HI;
+ buf[1] = PKG_HEADER_LO;
+
+ buf[2] = ((len+2) >> 8) & 0xFF;
+ buf[3] = (len + 2) & 0xFF;
+
+ buf[4] = TX_UART_CMD;
+
+ if ( not_add) {
+ buf[4] |= DEL_COUNTER;
+ }
+
+ if ( channel) {
+ buf[5] = (((channel - 1) % 13) & 0xFF);
+ } else {
+ buf[5] = ((channel % 13) & 0xFF);
+ }
+
+ memcpy(buf + 6, bufp, sizeof(uint8_t) * len);
+
+ buf[len + 6] = calc_chksum(buf + 4, len + 2);
+
+ return (tx_cmd(buf, len + 7, base, tx_addr, buf_size));
+}
+
+/*********************************************************************************************************
+** 函数名称: _backup_cmd
+** 功能描述: 备份姿轨控数据
+** 输 入 : bufp 备份数据缓冲区
+** len 备份数据长度
+** not_add 是否计错标志
+** base 基地址
+** tx_addr 发送缓冲区基地址
+** buf_size 发送缓冲区大小
+** 输 出 : 备份成功返回ERROR_NONE,否则返回PX_ERROR
+*********************************************************************************************************/
+static int32_t _backup_cmd(void *bufp, int32_t len, uint8_t not_add, addr_t base, addr_t tx_addr, int32_t buf_size)
+{
+ uint8_t buf[160];
+
+ if ( len > GNC_BACKUP_SIZE_MAX) {
+ return (-1);
+ }
+
+ buf[0] = PKG_HEADER_HI;
+ buf[1] = PKG_HEADER_LO;
+
+ buf[2] = ((len+2) >> 8) & 0xFF;
+ buf[3] = ((len+2) >> 0) & 0xFF;
+
+ buf[4] = TX_ZGK_BAK;
+
+ if ( not_add) {
+ buf[4] |= DEL_COUNTER;
+ }
+
+ buf[5] = GNC_BACKUP_BANK_SEL;
+
+ memcpy(buf + 6, bufp, len * sizeof(uint8_t));
+ buf[len + 6] = calc_chksum(buf + 4, len + 2);
+
+ return (tx_cmd(buf, len + 7, base, tx_addr, buf_size));
+}
+
+/*********************************************************************************************************
+** 函数名称: _gnc_request_cmd
+** 功能描述: 取回姿轨控备份数据请求
+** 输 入 : not_add 计错误标志
+** base 基地址
+** tx_addr 发送缓冲区基地址
+** buf_size 发送缓冲区大小
+** 输 出 : 请求成功返回ERROR_NONE,否则返回PX_ERROR
+*********************************************************************************************************/
+static int32_t _gnc_request_cmd(uint8_t not_add, addr_t base, addr_t tx_addr, int32_t buf_size)
+{
+ uint8_t buf[32];
+
+ buf[0] = PKG_HEADER_HI;
+ buf[1] = PKG_HEADER_LO;
+
+ buf[2] = 0x0;
+ buf[3] = 0x4;
+
+ buf[4] = REQ_TM_CMD;
+
+ if ( not_add) {
+ buf[4] |= DEL_COUNTER;
+ }
+
+ buf[5] = 0x0;
+
+ buf[6] = 0x20;
+ buf[7] = 0x00;
+
+ buf[8] = calc_chksum(buf + 4, 4);
+
+ return (tx_cmd(buf, 9, base, tx_addr, buf_size));
+}
+
+/*********************************************************************************************************
+** 函数名称: _fetch_cmd
+** 功能描述: 取回姿轨控备份数据
+** 输 入 : bufp 备份数据缓冲区
+** len 获取长度
+** base 基地址
+** tx_addr 发送缓冲区基地址
+** buf_size 发送缓冲区大小
+** 输 出 : 获取成功返回个数,否则返回PX_ERROR
+*********************************************************************************************************/
+static int32_t _fetch_cmd(void *bufp, int32_t len, addr_t base, addr_t tx_addr, int32_t buf_size, addr_t rx_addr)
+{
+ if ( len > GNC_BACKUP_SIZE_MAX) {
+ return (PX_ERROR);
+ }
+
+// if ( _gnc_request_cmd(NOT_NEED, base, tx_addr, buf_size) < 0) {
+// printk(KERN_ERR "_fetch_cmd(): request fetch cmd fail\r\n");
+//
+// return (PX_ERROR);
+// }
+//
+// API_TimeMSleep(2);
+
+ return (rx_cmd(bufp, len, base, rx_addr, buf_size));
+}
+
+/*********************************************************************************************************
+** 函数名称: _tm_request_cmd
+** 功能描述: 发送遥测请求
+** 输 入 : channel 通道号
+** not_add 是否计错标志
+** base 基地址
+** tx_addr 发送缓冲区基地址
+** buf_size 发送缓冲区大小
+** 输 出 : 发送成功返回ERROR_NONE,否则返回PX_ERROR
+*********************************************************************************************************/
+static int32_t _tm_request_cmd(uint8_t channel, uint8_t not_add, addr_t base, addr_t tx_addr, int32_t buf_size)
+{
+ uint8_t buf[9];
+
+ buf[0] = PKG_HEADER_HI;
+ buf[1] = PKG_HEADER_LO;
+
+ buf[2] = 0x0;
+ buf[3] = 0x4;
+
+ buf[4] = REQ_TM_CMD;
+
+ if ( not_add) {
+ buf[4] |= DEL_COUNTER;
+ }
+
+ buf[5] = 0x0;
+ buf[5] |= AUTO_START_422;
+ buf[5] |= AUTO_START_AD;
+
+ buf[6] = 0x1F;
+ buf[7] = 0xFF;
+
+ buf[8] = calc_chksum(buf + 4, 4);
+
+ return (tx_cmd(buf, 9, base, tx_addr, buf_size));
+}
+
+/*********************************************************************************************************
+** 函数名称: _com_request_cmd
+** 功能描述: 发送同步串口数据请求
+** 输 入 : buf 发送缓冲区
+** len 发送数据长度
+** not_add 是否计错标志
+** base 基地址
+** tx_addr 发送缓冲区基地址
+** buf_size 发送缓冲区大小
+** 输 出 : 发送成功返回ERROR_NONE,否则返回PX_ERROR
+*********************************************************************************************************/
+static int32_t _com_request_cmd(uint8_t *buf, int32_t len, uint8_t not_add, addr_t base, addr_t tx_addr, int32_t buf_size)
+{
+ uint8_t data[256];
+
+ if ( len > 256) {
+ return (PX_ERROR);
+ }
+
+ data[0] = PKG_HEADER_HI;
+ data[1] = PKG_HEADER_LO;
+
+ data[2] = ((len + 2) >> 8) & 0xFF;
+ data[3] = (len + 2) & 0xFF;
+
+ data[4] = TX_UART_CMD;
+
+ if ( not_add) {
+ data[4] |= DEL_COUNTER;
+ }
+
+ data[5] = 0x80;
+
+ memcpy(data + 6, buf, sizeof(uint8_t) * len);
+
+ data[len + 6] = calc_chksum(data + 4, len + 2);
+
+ return (tx_cmd(data, len + 7, base, tx_addr, buf_size));
+}
+
+/*********************************************************************************************************
+** 函数名称: mpi_open
+** 功能描述: 打开 MPI 设备
+** 输 入 : mpi_devp 设备
+** namep 设备名字
+** flags 标志
+** mode 模式
+** 输 出 : 文件节点
+*********************************************************************************************************/
+static long mpi_open(mpi_dev_t *mpi_devp, char *namep, int flags, int mode)
+{
+ PLW_FD_NODE pfdnode;
+ BOOL is_new;
+ uint32_t value;
+
+ if ( LW_NULL == namep) {
+ errno = ERROR_IO_NO_DEVICE_NAME_IN_PATH;
+ _ErrorHandle(ERROR_IO_NO_DEVICE_NAME_IN_PATH);
+
+ return (PX_ERROR);
+ } else {
+ pfdnode = API_IosFdNodeAdd(&mpi_devp->fdnode_header, (dev_t)mpi_devp, 0,
+ flags, mode, 0, 0, 0, LW_NULL, &is_new);
+ if ( LW_NULL == pfdnode) {
+ printk(KERN_ERR "mpi_open(): failed to add MPI fd node\r\n");
+
+ return (PX_ERROR);
+ }
+
+ if ( 1 == LW_DEV_INC_USE_COUNT(&mpi_devp->dev_hdr)) {
+ /**
+ ** 发送复位,设置发送为空闲
+ ** */
+ write32(RST_FLAG, mpi_devp->virt_addr_base + TX_REST_OFFSET);
+
+ /*
+ ** 接收清零,清空缓冲,置计数为零
+ ** */
+ write32(CLR_FLAG, mpi_devp->virt_addr_base + RX_CLR_OFFSET);
+
+ write32(0x1, 0x300000F8);
+
+ /*
+ * 将综合接口板从复位状态拉回正常工作状态,否则无法对综合接口板进行任何操作
+ */
+ /* 先置为'1' */
+ value = read32(SAST804_SYS_0_BASE);
+ value |= (0x2B << 8);
+ value |= (0x1 << 4);
+ write32(value, SAST804_SYS_0_BASE);
+ write32(value, SAST804_SYS_1_BASE);
+ write32(value, SAST804_SYS_2_BASE);
+
+ /* 后置为'0' */
+ value = read32(SAST804_SYS_0_BASE);
+ value |= (0x2B << 8);
+ value &= ~(0x1 << 4);
+ write32(value, SAST804_SYS_0_BASE);
+ write32(value, SAST804_SYS_1_BASE);
+ write32(value, SAST804_SYS_2_BASE);
+
+ mpi_devp->lock = API_SemaphoreMCreate("mpi_lock", LW_PRIO_DEF_CEILING, LW_OPTION_WAIT_PRIORITY |
+ LW_OPTION_INHERIT_PRIORITY | LW_OPTION_DELETE_SAFE |
+ LW_OPTION_OBJECT_GLOBAL, LW_NULL);
+ if ( LW_OBJECT_HANDLE_INVALID == mpi_devp->lock) {
+ printk(KERN_ERR "mpi_open(): failed to create MPI lock\r\n");
+
+ LW_DEV_DEC_USE_COUNT(&(mpi_devp->dev_hdr));
+ API_IosFdNodeDec(&(mpi_devp->fdnode_header), pfdnode, NULL);
+
+ return (PX_ERROR);
+ }
+
+ return ((long)pfdnode);
+ }
+
+ return ((long)pfdnode);
+ }
+}
+
+/*********************************************************************************************************
+** 函数名称: mpi_close
+** 功能描述: 关闭 MPI 设备
+** 输 入 : pFdEntry 文件结构
+** 输 出 : ERROR_CODE
+*********************************************************************************************************/
+static int mpi_close(PLW_FD_ENTRY pfdentry)
+{
+ PLW_FD_NODE pfdnode = (PLW_FD_NODE)(pfdentry->FDENTRY_pfdnode);
+ pmpi_dev_t pmpidev = (pmpi_dev_t)pfdentry->FDENTRY_pdevhdrHdr;
+
+ if ( pfdentry && pfdnode) {
+ if ( 0 == LW_DEV_DEC_USE_COUNT(&(pmpidev->dev_hdr))) {
+ API_SemaphoreMDelete(&pmpidev->lock);
+ API_IosFdNodeDec(&(pmpidev->fdnode_header), pfdnode, NULL);
+ }
+
+ return (ERROR_NONE);
+ } else {
+ return (PX_ERROR);
+ }
+}
+
+/*********************************************************************************************************
+** 函数名称: mpi_ioctl
+** 功能描述: 控制 MPI 设备
+** 输 入 : pfdentry 文件结构
+** cmd 命令
+** arg 参数
+** 输 出 : ERROR_CODE
+*********************************************************************************************************/
+static int mpi_ioctl(PLW_FD_ENTRY pfdentry, int cmd, long arg)
+{
+ mpi_dev_t *mpi_devp = (mpi_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+ uint32_t rx_len = 0;
+ int32_t ret_len = 0;
+ uint8_t *parg = (uint8_t *)arg;
+ uint8_t not_add;
+ uint32_t value = 0;
+
+ switch (cmd) {
+
+ case TX_DA :
+ /*
+ * byte 0 -- channel
+ * byte 1 -- add_or_not
+ * byte 2 -- da_value_msb
+ * byte 3 -- da_value_lsb
+ * */
+ if ( 0x1 == request_flag) {
+ usleep(5 * 1000);
+ }
+ API_SemaphoreMPend(mpi_devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ if ( _da_cmd(parg[0], (parg[2]<<8)|parg[3], parg[1], mpi_devp->virt_addr_base,
+ mpi_devp->tx_buf_base, mpi_devp->tx_buf_size) < 0) {
+ API_SemaphoreMPost(mpi_devp->lock);
+
+ return (PX_ERROR);
+ }
+
+ API_SemaphoreMPost(mpi_devp->lock);
+
+ break;
+
+ case TX_OC :
+ /*
+ * byte 0 -- channel
+ * byte 1 -- add_or_not
+ * byte 2 -- oc_width
+ * */
+ if ( 0x1 == request_flag) {
+ usleep(5 * 1000);
+ }
+ API_SemaphoreMPend(mpi_devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ if ( _oc_cmd(parg[0], parg[2], parg[1], mpi_devp->virt_addr_base,
+ mpi_devp->tx_buf_base, mpi_devp->tx_buf_size) < 0) {
+ API_SemaphoreMPost(mpi_devp->lock);
+
+ return (PX_ERROR);
+ }
+
+ API_SemaphoreMPost(mpi_devp->lock);
+
+ break;
+
+ case TX_422:
+ /*
+ * byte 0 -- channel
+ * byte 1 -- len_msb
+ * byte 2 -- len_lsb
+ * byte 3 -- add_or_not
+ * byte 4 -- buffer
+ * */
+ if ( 0x1 == request_flag) {
+ usleep(5 * 1000);
+ }
+ API_SemaphoreMPend(mpi_devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ if ( _com_cmd(parg[0], parg+4, (parg[1]<<8)|parg[2], parg[3], mpi_devp->virt_addr_base,
+ mpi_devp->tx_buf_base, mpi_devp->tx_buf_size) < 0) {
+ API_SemaphoreMPost(mpi_devp->lock);
+
+ return (PX_ERROR);
+ }
+
+ API_SemaphoreMPost(mpi_devp->lock);
+
+ break;
+
+ case BACKUP_GNC:
+ /*
+ * byte 0 -- len_msb
+ * byte 1 -- len_lsb
+ * byte 2 -- add_or_not
+ * byte 3 -- buffer
+ */
+ if ( 0x1 == request_flag) {
+ usleep(5 * 1000);
+ }
+ API_SemaphoreMPend(mpi_devp->lock, LW_OPTION_WAIT_INFINITE);
+ ret_len = (parg[0]<<8) | parg[1];
+ not_add = parg[2];
+ if ( _backup_cmd(parg+3, ret_len, not_add, mpi_devp->virt_addr_base,
+ mpi_devp->tx_buf_base, mpi_devp->tx_buf_size) < 0) {
+ API_SemaphoreMPost(mpi_devp->lock);
+
+ return (PX_ERROR);
+ }
+
+ API_SemaphoreMPost(mpi_devp->lock);
+
+ break;
+
+ case FETCH_GNC:
+ /*
+ * byte 0 -- len_msb
+ * byte 1 -- len_lsb
+ * byte 2 -- buffer
+ * */
+ if ( 0x1 == request_flag) {
+ usleep(5 * 1000);
+ }
+ API_SemaphoreMPend(mpi_devp->lock, LW_OPTION_WAIT_INFINITE);
+ ret_len = (parg[0]<<8) | parg[1];
+ if ( (rx_len = _fetch_cmd(parg, ret_len, mpi_devp->virt_addr_base,
+ mpi_devp->tx_buf_base, mpi_devp->tx_buf_size, mpi_devp->rx_buf_base)) < 0 ) {
+ API_SemaphoreMPost(mpi_devp->lock);
+
+ return (PX_ERROR);
+ }
+ if ( rx_len > ret_len) {
+ rx_len = 0;
+ }
+ API_SemaphoreMPost(mpi_devp->lock);
+
+ break;
+
+ case REQ_GNC:
+ /*
+ * byte 0 -- len_msb
+ * byte 1 -- len_lsb
+ * */
+ if ( 0x1 == request_flag) {
+ usleep(5 * 1000);
+ }
+ API_SemaphoreMPend(mpi_devp->lock, LW_OPTION_WAIT_INFINITE);
+ //ret_len = (parg[0]<<8) | parg[1];
+// if ( (rx_len = _fetch_cmd(parg, ret_len, mpi_devp->virt_addr_base,
+// mpi_devp->tx_buf_base, mpi_devp->tx_buf_size, mpi_devp->rx_buf_base)) < 0 ) {
+// API_SemaphoreMPost(mpi_devp->lock);
+//
+// return (PX_ERROR);
+// }
+
+ if ( _gnc_request_cmd(NOT_NEED, mpi_devp->virt_addr_base, mpi_devp->tx_buf_base, mpi_devp->tx_buf_size) < 0) {
+ printk(KERN_ERR "_fetch_cmd(): request fetch cmd fail\r\n");
+
+ return (PX_ERROR);
+ }
+ API_SemaphoreMPost(mpi_devp->lock);
+ break;
+
+ case REQ_TM:
+ /*
+ * byte 0 -- and_or_not
+ * */
+ request_flag = 0x1;
+ API_SemaphoreMPend(mpi_devp->lock, LW_OPTION_WAIT_INFINITE);
+ rx_len = _tm_request_cmd(0x0, (uint8_t)arg, mpi_devp->virt_addr_base, mpi_devp->tx_buf_base, mpi_devp->tx_buf_size);
+ API_SemaphoreMPost(mpi_devp->lock);
+ break;
+
+ case MPIO_RESET:
+ /* Reset*/
+ API_SemaphoreMPend(mpi_devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ /* 先置为'1' */
+ value = read32(SAST804_SYS_0_BASE);
+ value |= (0x2B << 8);
+ value |= (0x1 << 4);
+ write32(value, SAST804_SYS_0_BASE);
+ write32(value, SAST804_SYS_1_BASE);
+ write32(value, SAST804_SYS_2_BASE);
+ API_SemaphoreMPost(mpi_devp->lock);
+
+ /* 后置为'0' */
+ value = read32(SAST804_SYS_0_BASE);
+ value |= (0x2B << 8);
+ value &= ~(0x1 << 4);
+ write32(value, SAST804_SYS_0_BASE);
+ write32(value, SAST804_SYS_1_BASE);
+ write32(value, SAST804_SYS_2_BASE);
+
+
+ break;
+
+ default:
+ return (PX_ERROR);
+ }
+
+ return (rx_len);
+}
+
+/*********************************************************************************************************
+** 函数名称: mpi_write
+** 功能描述: 驱动 write 函数
+** 输 入 : pfdentry
+** bufp 写缓冲
+** len 写数据长度
+** 输 出 : 成功写入数据字节数量
+*********************************************************************************************************/
+static ssize_t mpi_write(PLW_FD_ENTRY pfdentry, void *bufp, size_t len)
+{
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: mpi_read
+** 功能描述: 驱动 read 函数
+** 输 入 :
+** 输 出 : 成功读取数据字节数量
+*********************************************************************************************************/
+static ssize_t mpi_read(PLW_FD_ENTRY pfdentry, void *bufp, size_t len)
+{
+ uint8_t data[512];
+ int32_t ret;
+ uint8_t not_add;
+ int32_t rx_len = 0;
+ uint8_t *buf = (uint8_t *)bufp;
+ mpi_dev_t *mpi_devp = (mpi_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+ uint8_t tx_buf[14] = {0xEB, 0x90, 0x10, 0x00, 0xC0, 0x00, 0x00,
+ 0x05, 0xAA, 0xAA, 0xAA, 0xAA, 0x00, 0x00};
+
+ /*
+ * byte 0 -- not_add
+ * */
+ not_add = buf[0];
+ //printk(KERN_ERR "###inread\r\n");
+ API_SemaphoreMPend(mpi_devp->lock, LW_OPTION_WAIT_INFINITE);
+ //printk(KERN_ERR "###aread\r\n");
+ ret = rx_cmd(data, 288, mpi_devp->virt_addr_base, mpi_devp->rx_buf_base, mpi_devp->rx_buf_size);
+ if ( ret < 0) {
+ io_tm_error_cnt++;
+
+ _com_request_cmd(tx_buf, 14, not_add, mpi_devp->virt_addr_base, mpi_devp->tx_buf_base, mpi_devp->tx_buf_size);
+
+ API_SemaphoreMPost(mpi_devp->lock);
+ request_flag = 0x0;
+
+ return (PX_ERROR);
+ } else {
+ if ( 288 == ret) {
+ if ( !(0xEB == data[0] && 0x90 == data[1])) {
+ //printk(KERN_ERR "[MPI-TM] sync header invalid\r\n");
+ io_tm_error_cnt++;
+
+ rx_len = 0;
+
+ _com_request_cmd(tx_buf, 14, not_add, mpi_devp->virt_addr_base, mpi_devp->tx_buf_base, mpi_devp->tx_buf_size);
+
+ API_SemaphoreMPost(mpi_devp->lock);
+ request_flag = 0x0;
+ return (rx_len);
+ }
+
+ if (!is_ad_data_valid((uint16_t *) (data + 30), 129)) {
+ //printk(KERN_ERR "[MPI-TM] ad invalid\r\n");
+ io_tm_error_cnt++;
+ rx_len = 0;
+ _com_request_cmd(tx_buf, 14, not_add, mpi_devp->virt_addr_base, mpi_devp->tx_buf_base, mpi_devp->tx_buf_size);
+
+ API_SemaphoreMPost(mpi_devp->lock);
+ request_flag = 0x0;
+ return (rx_len);
+ } else {
+ io_tm_right_cnt++;
+ }
+
+ *(buf + 0) = io_tm_right_cnt & 0xFF;
+ *(buf + 1) = io_tm_error_cnt & 0xFF;
+ memcpy(buf + 2, data + 4, ret - 6);
+ rx_len = ret - 4;
+
+ _com_request_cmd(tx_buf, 14, not_add, mpi_devp->virt_addr_base, mpi_devp->tx_buf_base, mpi_devp->tx_buf_size);
+ request_flag = 0x0;
+ } else {
+ //printk(KERN_ERR "[MPI-TM] rx len not 284: %d\r\n", ret);
+ io_tm_error_cnt++;
+
+ rx_len = 0;
+ _com_request_cmd(tx_buf, 14, not_add, mpi_devp->virt_addr_base, mpi_devp->tx_buf_base, mpi_devp->tx_buf_size);
+ request_flag = 0x0;
+ }
+ }
+
+ API_SemaphoreMPost(mpi_devp->lock);
+
+ return (rx_len);
+}
+
+/*********************************************************************************************************
+** 函数名称: mpi_drv
+** 功能描述: 安装 MPI 驱动
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+*********************************************************************************************************/
+static int mpi_drv(void)
+{
+ struct file_operations filops;
+
+ if ( mpi_drv_num) {
+
+ return (ERROR_NONE);
+ }
+
+ lib_memset(&filops, 0, sizeof(struct file_operations));
+
+ filops.owner = THIS_MODULE;
+ filops.fo_create = mpi_open;
+ filops.fo_open = mpi_open;
+ filops.fo_close = mpi_close;
+ filops.fo_ioctl = mpi_ioctl;
+ filops.fo_write = mpi_write;
+ filops.fo_read = mpi_read;
+
+ mpi_drv_num = iosDrvInstallEx2(&filops, LW_DRV_TYPE_NEW_1);
+
+ DRIVER_LICENSE(mpi_drv_num, "Dual BSD/GPL->Ver 1.0");
+ DRIVER_AUTHOR(mpi_drv_num, "Gavin.Bai");
+ DRIVER_DESCRIPTION(mpi_drv_num, "MPI driver.");
+
+ return (mpi_drv_num > 0) ? (ERROR_NONE) : (PX_ERROR);
+}
+
+/*********************************************************************************************************
+** 函数名称: mpi_devadd
+** 功能描述: 创建 MPI 设备
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+*********************************************************************************************************/
+static int mpi_devadd(void)
+{
+ mpi_dev_t *mpi_devp;
+
+ mpi_devp = &sast804_mpi_dev;
+
+ mpi_devp->phy_addr_base = SAST804_MPI_BASE;
+ mpi_devp->phy_addr_size = LW_CFG_VMM_PAGE_SIZE;
+ mpi_devp->virt_addr_base = SAST804_MPI_BASE;
+
+ mpi_devp->tx_buf_base = TX_BUFFER;
+ mpi_devp->rx_buf_base = RX_BUFFER;
+
+ mpi_devp->tx_buf_size = TX_BUF_SIZE;
+ mpi_devp->rx_buf_size = RX_BUF_SIZE;
+
+ if ( ERROR_NONE != API_IosDevAddEx(&mpi_devp->dev_hdr, SAST804_MPI_DEV, mpi_drv_num, DT_CHR)) {
+ printk(KERN_ERR "mpi_devadd(): can not add MPI device : %s.\n", strerror(errno));
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: module_init
+** 功能描述: 内核模块加载函数
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+*********************************************************************************************************/
+int32_t module_init(void)
+{
+ if ( mpi_drv()) {
+ printk(KERN_ERR "module_init(): can not add MPI device driver: %s.\r\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ if ( mpi_devadd()) {
+ printk(KERN_ERR "module_init(): can not add MPI device: %s\r\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: module_exit
+** 功能描述: 内核模块卸载函数
+** 输 入 : NONE
+** 输 出 : NONE
+*********************************************************************************************************/
+void module_exit(void)
+{
+ iosDevFileAbnormal(&(sast804_mpi_dev.dev_hdr));
+ iosDevDelete(&(sast804_mpi_dev.dev_hdr));
+ iosDrvRemove(mpi_drv_num, TRUE);
+}
diff --git a/SylixOS/kmodule/mpc750_mpi/mpc750_mpi_com.h b/SylixOS/kmodule/mpc750_mpi/mpc750_mpi_com.h
new file mode 100644
index 0000000..7dd7d2f
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_mpi/mpc750_mpi_com.h
@@ -0,0 +1,36 @@
+/*********************************************************************************************************
+ **
+ ** 中国软件开源组织
+ **
+ ** 嵌入式实时操作系统
+ **
+ ** SylixOS(TM)
+ **
+ ** Copyright All Rights Reserved
+ **
+ **--------------文件信息--------------------------------------------------------------------------------
+ **
+ ** 文 件 名: mpc750_mpi_com.c
+ **
+ ** 创 建 人:
+ **
+ ** 文件创建日期: 2019 年 02 月 23 日
+ **
+** 描 述 : 综合接口板驱动
+ ********************************************************************************************************/
+
+#ifndef SRC_MPC750_MPI_COM_H_
+#define SRC_MPC750_MPI_COM_H_
+
+#include <sys/ioccom.h>
+
+#define TX_DA _IOW('x', 244, int) /* 发送DA数据 */
+#define TX_OC _IOW('x', 245, int) /* 发送OC门数据 */
+#define TX_422 _IOW('x', 246, int) /* 发送422数据 */
+#define BACKUP_GNC _IOW('x', 247, int) /* 备份姿轨控数据 */
+#define FETCH_GNC _IOW('x', 248, int) /* 获取备份数据 */
+#define REQ_TM _IOW('x', 249, int)
+#define REQ_GNC _IOW('x', 251, int)
+#define MPIO_RESET _IOW('x', 243, int) /* 复位综合接口板 */
+
+#endif /* SRC_MPC750_MPI_COM_H_ */
diff --git a/SylixOS/kmodule/mpc750_nand/mpc750_nand.c b/SylixOS/kmodule/mpc750_nand/mpc750_nand.c
new file mode 100644
index 0000000..9d27179
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_nand/mpc750_nand.c
@@ -0,0 +1,603 @@
+#define __SYLIXOS_KERNEL
+#include <SylixOS.h>
+#include <module.h>
+#include <string.h>
+
+
+#include "mpc750_nand_com.h"
+
+#define NAND_BUF_MAX (8192)
+
+#ifndef __DEBUG_PRINTF
+#define __DEBUG_PRINTF
+#endif
+
+/*********************************************************************************************************
+ Nand相关宏定义
+*********************************************************************************************************/
+#define SAST804_NAND_BASE (0x30000000)
+#define SAST804_NAND_NAME ("/dev/nand")
+
+#define NAND_WR_BUF (0x10004000)
+#define NAND_RD_BUF (0x10006000)
+
+#define SRAM_SHARED_OFFSET (0x0F8)
+#define MRAM_INIT_OFFSET (0x0FC) /* 初始化坏块表偏移 */
+
+#define TX_START_OFFSET (0x100) /* 写入存储长度,可为8192 */
+#define TX_CNT_OFFSET (0x104) /* 已经写入字节数,写0清除计数 */
+
+#define PB_START_OFFSET (0x108) /* 回放 */
+#define PB_STOP_OFFSET (0x10C)
+#define PB_PAGES_OFFSET (0x110)
+
+#define RX_START_OFFSET (0x114)
+#define RX_CNT_OFFSET (0x118)
+
+#define MODE_YC_OFFSET (0x140)
+
+#define HM_OFFSET (0x200034)
+
+#define RST_VALUE (0x0)
+#define ANY_VALUE (0x55AA)
+#define INIT_VALUE (0x55AA)
+
+typedef struct {
+ LW_DEV_HDR devhdr;
+ LW_LIST_LINE_HEADER fdnode_header;
+
+ addr_t phy_addr_base; /* 物理地址基地址 */
+ LONG phy_addr_size; /* 物理地址空间大小 */
+ addr_t virt_addr_base; /* 虚拟地址基地址 */
+
+ addr_t rd_buf_base;
+ addr_t wr_buf_base;
+
+ LW_HANDLE lock;
+} nand_dev_t;
+
+
+/********************************************************************************************************
+ nand设备驱动个数
+ ********************************************************************************************************/
+static UINT32 nand_drv_num = 0;
+
+/********************************************************************************************************
+ RTC设备实例化
+ ********************************************************************************************************/
+static nand_dev_t sast804_nand_dev;
+
+uint32_t _version_nm = 0x20010102;
+static uint32_t restore_flag = 0x0;
+
+
+/********************************************************************************************************
+ ** 函数名称: nand_open
+ ** 功能描述: 打开 NAND 设备
+ ** 输 入 : nand_devp 设备
+ ** namep 设备名字
+ ** flags 标志
+ ** mode 模式
+ ** 输 出 : 文件节点
+ ** 全局变量:
+ ** 调用模块:
+ ********************************************************************************************************/
+static long nand_open(nand_dev_t *nand_devp, char *namep, int flags, int mode)
+{
+ PLW_FD_NODE pfdnode;
+ BOOL is_new;
+ uint32_t retry = 0;
+
+ if ( LW_NULL == namep) {
+ errno = ERROR_IO_NO_DEVICE_NAME_IN_PATH;
+ _ErrorHandle(ERROR_IO_NO_DEVICE_NAME_IN_PATH);
+
+ return (PX_ERROR);
+ } else {
+
+ pfdnode = API_IosFdNodeAdd(&(nand_devp->fdnode_header), (dev_t)nand_devp,
+ 0, flags, mode, 0, 0, 0, LW_NULL, &is_new);
+ if ( LW_NULL == pfdnode) {
+ printk(KERN_ERR "nand_open(): failed to add NAND fd node\r\n");
+
+ return (PX_ERROR);
+ }
+
+ if ( 0x1 == LW_DEV_INC_USE_COUNT(&(nand_devp->devhdr))) {
+
+ while ( !(read32(nand_devp->virt_addr_base + SRAM_SHARED_OFFSET) & 0x1)) {
+ retry++;
+ if ( 5000 == retry) {
+ return (PX_ERROR);
+ }
+
+ write32(0x1, nand_devp->virt_addr_base + SRAM_SHARED_OFFSET);
+ }
+
+ restore_flag = 0x0;
+
+ nand_devp->lock = API_SemaphoreMCreate("nand_lock", LW_PRIO_DEF_CEILING, LW_OPTION_WAIT_PRIORITY |
+ LW_OPTION_INHERIT_PRIORITY | LW_OPTION_DELETE_SAFE |
+ LW_OPTION_OBJECT_GLOBAL, LW_NULL);
+ if ( LW_OBJECT_HANDLE_INVALID == nand_devp) {
+ printk(KERN_ERR "nand_open(): create lock for nand error\r\n");
+
+ LW_DEV_DEC_USE_COUNT(&(nand_devp->devhdr));
+ API_IosFdNodeDec(&(nand_devp->fdnode_header), pfdnode, NULL);
+
+ return (PX_ERROR);
+ }
+
+ return ((long)pfdnode);
+ }
+
+ return ((long)pfdnode);
+ }
+}
+
+/********************************************************************************************************
+ ** 函数名称: nand_close
+ ** 功能描述: 关闭 NAND 设备
+ ** 输 入 : pfdentry 设备结构
+ ** 输 出 : ERROR_CODE
+ ** 全局变量:
+ ** 调用模块:
+ ********************************************************************************************************/
+static int nand_close(PLW_FD_ENTRY pfdentry)
+{
+ PLW_FD_NODE pfdnode = (PLW_FD_NODE)pfdentry->FDENTRY_pfdnode;
+ nand_dev_t *nand_devp = (nand_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+
+ if ( pfdentry && pfdnode) {
+
+ if ( 0x0 == LW_DEV_DEC_USE_COUNT(&(nand_devp->devhdr))) {
+ write32(ANY_VALUE, nand_devp->virt_addr_base + PB_STOP_OFFSET);
+
+ API_SemaphoreMDelete(&(nand_devp->lock));
+ API_IosFdNodeDec(&(nand_devp->fdnode_header), pfdnode, NULL);
+ }
+
+ return (ERROR_NONE);
+ } else {
+ return (PX_ERROR);
+ }
+}
+
+/********************************************************************************************************
+ ** 函数名称: nand_ioctl
+ ** 功能描述: 控制 NAND 设备
+ ** 输 入 : pfdentry 文件结构
+ ** cmd 命令
+ ** arg 参数
+ ** 输 出 : ERROR_CODE
+ ** 全局变量:
+ ** 调用模块:
+ ********************************************************************************************************/
+static int nand_ioctl(PLW_FD_ENTRY pfdentry, int cmd, long arg)
+{
+ nand_dev_t *nand_devp = (nand_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+ UINT32 val;
+ UINT32 ret;
+ UINT32 *yc_buf = (UINT32 *)arg;
+
+ switch (cmd) {
+
+ case NAND_RD_RESET:
+ if ( 0x55AA == restore_flag) {
+ val = read32(nand_devp->virt_addr_base + MODE_YC_OFFSET + 4);
+ if ( (val >> 29) & 0x1) {
+ return (PX_ERROR);
+ } else {
+ restore_flag = 0x0;
+ }
+ }
+
+ API_SemaphoreMPend(nand_devp->lock, LW_OPTION_WAIT_INFINITE);
+ write32(RST_VALUE, nand_devp->virt_addr_base + RX_CNT_OFFSET);
+ API_SemaphoreMPost(nand_devp->lock);
+ break;
+
+ case NAND_WR_RESET:
+ if ( 0x55AA == restore_flag) {
+ val = read32(nand_devp->virt_addr_base + MODE_YC_OFFSET + 4);
+ if ( (val >> 29) & 0x1) {
+ return (PX_ERROR);
+ } else {
+ restore_flag = 0x0;
+ }
+ }
+
+ API_SemaphoreMPend(nand_devp->lock, LW_OPTION_WAIT_INFINITE);
+ write32(RST_VALUE, nand_devp->virt_addr_base + TX_CNT_OFFSET);
+ API_SemaphoreMPost(nand_devp->lock);
+ break;
+
+ case NAND_RD_COUNT:
+ API_SemaphoreMPend(nand_devp->lock, LW_OPTION_WAIT_INFINITE);
+ val = read32(nand_devp->virt_addr_base + RX_CNT_OFFSET);
+ *(UINT32 *)arg = val;
+ API_SemaphoreMPost(nand_devp->lock);
+ break;
+
+ case NAND_WR_COUNT:
+ API_SemaphoreMPend(nand_devp->lock, LW_OPTION_WAIT_INFINITE);
+ val = read32(nand_devp->virt_addr_base + TX_CNT_OFFSET);
+ *(UINT32 *)arg = val;
+ API_SemaphoreMPost(nand_devp->lock);
+ break;
+
+ case NAND_PB_START:
+ if ( 0x55AA == restore_flag) {
+ val = read32(nand_devp->virt_addr_base + MODE_YC_OFFSET + 4);
+ if ( (val >> 29) & 0x1) {
+ return (PX_ERROR);
+ } else {
+ restore_flag = 0x0;
+ }
+ }
+
+ API_SemaphoreMPend(nand_devp->lock, LW_OPTION_WAIT_INFINITE);
+ write32(ANY_VALUE, nand_devp->virt_addr_base + PB_START_OFFSET);
+ API_SemaphoreMPost(nand_devp->lock);
+ break;
+
+ case NAND_PB_STOP:
+ if ( 0x55AA == restore_flag) {
+ val = read32(nand_devp->virt_addr_base + MODE_YC_OFFSET + 4);
+ if ( (val >> 29) & 0x1) {
+ return (PX_ERROR);
+ } else {
+ restore_flag = 0x0;
+ }
+ }
+
+ API_SemaphoreMPend(nand_devp->lock, LW_OPTION_WAIT_INFINITE);
+ write32(ANY_VALUE, nand_devp->virt_addr_base + PB_STOP_OFFSET);
+ API_SemaphoreMPost(nand_devp->lock);
+ break;
+
+ case NAND_PB_SET_PAGES:
+ if ( 0x55AA == restore_flag) {
+ val = read32(nand_devp->virt_addr_base + MODE_YC_OFFSET + 4);
+ if ( (val >> 29) & 0x1) {
+ return (PX_ERROR);
+ } else {
+ restore_flag = 0x0;
+ }
+ }
+
+ API_SemaphoreMPend(nand_devp->lock, LW_OPTION_WAIT_INFINITE);
+ val = *(UINT32 *)arg;
+ write32(val, nand_devp->virt_addr_base + PB_PAGES_OFFSET);
+ API_SemaphoreMPost(nand_devp->lock);
+ break;
+
+ case NAND_MODE_YC:
+ API_SemaphoreMPend(nand_devp->lock, LW_OPTION_WAIT_INFINITE);
+ *(yc_buf + 0) = read32(nand_devp->virt_addr_base + MODE_YC_OFFSET + 0x0);
+ *(yc_buf + 1) = read32(nand_devp->virt_addr_base + MODE_YC_OFFSET + 0x4);
+ *(yc_buf + 2) = read32(nand_devp->virt_addr_base + MODE_YC_OFFSET + 0x8);
+ *(yc_buf + 3) = read32(nand_devp->virt_addr_base + MODE_YC_OFFSET + 0xC);
+ API_SemaphoreMPost(nand_devp->lock);
+ break;
+
+ case NAND_SWITCH_HM:
+ if ( 0x55AA == restore_flag) {
+ val = read32(nand_devp->virt_addr_base + MODE_YC_OFFSET + 4);
+ if ( (val >> 29) & 0x1) {
+ return (PX_ERROR);
+ } else {
+ restore_flag = 0x0;
+ }
+ }
+
+ API_SemaphoreMPend(nand_devp->lock, LW_OPTION_WAIT_INFINITE);
+ val = (UINT32)arg;
+ if ( 1 == val) {
+ ret = (0xA5A5<<16) | (0x7<<11);
+ write32(ret, nand_devp->virt_addr_base + HM_OFFSET);
+ } else {
+ ret = (0xA5A5<<16) & ~(0x7<<11);
+ write32(ret, nand_devp->virt_addr_base + HM_OFFSET);
+ }
+ API_SemaphoreMPost(nand_devp->lock);
+ break;
+
+ case NAND_ACQUIRE_HM:
+ API_SemaphoreMPend(nand_devp->lock, LW_OPTION_WAIT_INFINITE);
+ *((uint32_t *)&arg) = read32(nand_devp->virt_addr_base + HM_OFFSET);
+ API_SemaphoreMPost(nand_devp->lock);
+ break;
+
+ case NAND_RESTORE_BBLOCK:
+ API_SemaphoreMPend(nand_devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ write32(INIT_VALUE, nand_devp->virt_addr_base + MRAM_INIT_OFFSET);
+ restore_flag = 0x55AA;
+
+ API_SemaphoreMPost(nand_devp->lock);
+ break;
+
+ default:
+ errno = ENOSYS;
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/********************************************************************************************************
+ ** 函数名称: nand_write
+ ** 功能描述: 驱动 write 函数,实现授时
+ ** 输 入 : pfdentry 文件结构
+ ** bufp 写缓冲
+ ** len 写数据长度
+ ** 输 出 : 成功写入数据字节数量
+ ** 全局变量:
+ ** 调用模块:
+ ********************************************************************************************************/
+static ssize_t nand_write(PLW_FD_ENTRY pfdentry, void *buf, size_t len)
+{
+ nand_dev_t *nand_devp = (nand_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+ unsigned char *bufp = (unsigned char *)buf;
+ unsigned int *buf32 = (unsigned int *)buf;
+ unsigned int new_len = (len > NAND_BUF_MAX) ? NAND_BUF_MAX : len;
+ size_t i;
+ unsigned int cnt = 0;
+ unsigned int div = 0;
+ unsigned int left = 0;
+ unsigned int retry = 0;
+ unsigned int val;
+
+ if ( 0x55AA == restore_flag) {
+ val = read32(nand_devp->virt_addr_base + MODE_YC_OFFSET + 4);
+ if ( (val>>29)) {
+ return (PX_ERROR);
+ } else {
+ restore_flag = 0x0;
+ }
+ }
+
+ API_SemaphoreMPend(nand_devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ /*
+ * 忙时等待直到空为止
+ */
+ while ( read32(nand_devp->virt_addr_base + TX_CNT_OFFSET) & 0x80000000) {
+ retry++;
+ if ( 10000 == retry) {
+ API_SemaphoreMPost(nand_devp->lock);
+ return (PX_ERROR);
+ }
+ }
+
+ /*
+ * 填充数
+ */
+ div = new_len / 4;
+ left = new_len % 4;
+ while ( cnt < div) {
+ write32(*buf32, nand_devp->wr_buf_base + (cnt<<2));
+
+ ++cnt;
+ buf32++;
+ }
+
+ if ( left) {
+ for (i = 0; i < left; ++i) {
+ write8(*(bufp + (cnt<<2) + i), nand_devp->wr_buf_base + (cnt<<2) + i);
+ }
+ }
+ /*
+ * 启动发送
+ */
+ write32(new_len, nand_devp->virt_addr_base + TX_START_OFFSET);
+
+ API_SemaphoreMPost(nand_devp->lock);
+
+ return (new_len);
+}
+
+/********************************************************************************************************
+ ** 函数名称: nand_read
+ ** 功能描述: 驱动 read 函数
+ ** 输 入 : fdentry -- 文件结构
+ ** bufp -- 读缓冲
+ ** len -- 读长度
+ ** 输 出 : 成功读取数据字节数量
+ ** 全局变量:
+ ** 调用模块:
+ ********************************************************************************************************/
+static ssize_t nand_read(PLW_FD_ENTRY pfdentry, void *buf, size_t len)
+{
+ nand_dev_t *nand_devp = (nand_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+ unsigned char *bufp = (unsigned char *)buf;
+ unsigned int new_len = (len > NAND_BUF_MAX) ? NAND_BUF_MAX : len;
+ unsigned int cnt = 0;
+ unsigned int rx_cnt = 0;
+ unsigned int fifo_stat = 0;
+ unsigned int *buf32 = (unsigned int *)buf;
+ unsigned int left = 0;
+ unsigned int div = 0;
+ int i;
+ unsigned int retry = 0;
+ unsigned int val;
+
+ if ( 0x55AA == restore_flag) {
+ val = read32(nand_devp->virt_addr_base + MODE_YC_OFFSET + 4);
+ if ( (val>>29)) {
+ return (PX_ERROR);
+ } else {
+ restore_flag = 0x0;
+ }
+ }
+
+ API_SemaphoreMPend(nand_devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ do {
+ retry++;
+ if ( 10000 == retry) {
+#ifdef __DEBUG_PRINTF
+ printk(KERN_ERR "[NAND-DRV] Fifo status is not ok-%d\r\n", fifo_stat);
+#endif /* __DEBUG_PRINTF */
+
+ API_SemaphoreMPost(nand_devp->lock);
+ return (PX_ERROR);
+ }
+ fifo_stat = read32(nand_devp->virt_addr_base + RX_CNT_OFFSET) & 0x80000000;
+
+ usleep(10);
+ } while ( !fifo_stat);
+
+ write32(new_len, nand_devp->virt_addr_base + RX_START_OFFSET);
+ API_SemaphoreMPost(nand_devp->lock);
+
+ usleep(5*1000);
+
+ API_SemaphoreMPend(nand_devp->lock, LW_OPTION_WAIT_INFINITE);
+ rx_cnt = read32(nand_devp->virt_addr_base + RX_CNT_OFFSET) & 0x2000;
+
+ retry = 0;
+ while ( new_len > rx_cnt) {
+ usleep(5);
+ retry++;
+ if ( 10000 == retry) {
+#ifdef __DEBUG_PRINTF
+ printk(KERN_ERR "[NAND-DRV] Read counter of buffer is not ok -%d\r\n", rx_cnt);
+#endif /* __DEBUG_PRINTF */
+ API_SemaphoreMPost(nand_devp->lock);
+ return (PX_ERROR);
+ }
+
+ rx_cnt = read32(nand_devp->virt_addr_base + RX_CNT_OFFSET) & 0x2000;
+ usleep(10);
+ }
+
+ div = new_len / 4;
+ left = new_len % 4;
+ while ( cnt < div) {
+ *buf32 = read32(nand_devp->rd_buf_base + (cnt<<2));
+
+ ++cnt;
+ ++buf32;
+ }
+
+ if ( left) {
+ for (i = 0; i < left; ++i) {
+ *(bufp + (cnt<<2) + i) = read8(nand_devp->rd_buf_base + (cnt<<2) + i);
+ }
+ }
+
+ API_SemaphoreMPost(nand_devp->lock);
+
+ return (new_len);
+}
+
+/********************************************************************************************************
+ ** 函数名称: nand_drv
+ ** 功能描述: 安装 NAND 驱动
+ ** 输 入 : NONE
+ ** 输 出 : ERROR_CODE
+ ** 全局变量:
+ ** 调用模块:
+ ********************************************************************************************************/
+static int nand_drv(void)
+{
+ struct file_operations nand_ops;
+
+ if ( nand_drv_num) {
+ return (ERROR_NONE);
+ }
+
+ lib_memcpy(&nand_ops, 0, sizeof(struct file_operations));
+
+ nand_ops.owner = THIS_MODULE;
+ nand_ops.fo_create = nand_open;
+ nand_ops.fo_open = nand_open;
+ nand_ops.fo_close = nand_close;
+ nand_ops.fo_ioctl = nand_ioctl;
+ nand_ops.fo_read = nand_read;
+ nand_ops.fo_write = nand_write;
+
+ nand_drv_num = API_IosDrvInstallEx2(&nand_ops, LW_DRV_TYPE_NEW_1);
+
+ DRIVER_LICENSE(nand_drv_num, "Dual BSD/GPL ->Ver1.0");
+ DRIVER_AUTHOR(nand_drv_num, "Gavin.Bai");
+ DRIVER_DESCRIPTION(nand_drv_num, "NAND Driver");
+
+ return (nand_drv_num > 0 ? (ERROR_NONE) : (PX_ERROR));
+}
+
+/********************************************************************************************************
+ ** 函数名称: nand_devadd
+ ** 功能描述: 创建NAND设备
+ ** 输 入 : index -- NAND索引
+ ** 输 出 : ERROR_CODE
+ ** 全局变量:
+ ** 调用模块:
+ ********************************************************************************************************/
+int nand_devadd(void)
+{
+ nand_dev_t *nand_devp;
+
+ nand_devp = &sast804_nand_dev;
+
+ nand_devp->phy_addr_base = SAST804_NAND_BASE;
+ nand_devp->phy_addr_size = LW_CFG_VMM_PAGE_SIZE;
+ nand_devp->virt_addr_base = SAST804_NAND_BASE;
+
+ nand_devp->rd_buf_base = NAND_RD_BUF;
+ nand_devp->wr_buf_base = NAND_WR_BUF;
+
+
+ if ( ERROR_NONE != API_IosDevAddEx(&(nand_devp->devhdr), SAST804_NAND_NAME, nand_drv_num, DT_CHR)) {
+ printk(KERN_ERR "nand_devadd(): can not add device : %s.\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+
+/********************************************************************************************************
+ ** 函数名称: module_init
+ ** 功能描述: 内核模块加载函数
+ ** 输 入 : NONE
+ ** 输 出 : ERROR_CODE
+ ** 全局变量:
+ ** 调用模块:
+ ********************************************************************************************************/
+int module_init(void)
+{
+ if ( nand_drv()) {
+ printk(KERN_ERR "module_init(): can not add NAND device driver : %s.\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ if ( nand_devadd()) {
+ printk(KERN_ERR "module_init(): can not add NAND device : %s.\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/********************************************************************************************************
+ ** 函数名称: module_exit
+ ** 功能描述: 内核模块卸载函数
+ ** 输 入 : NONE
+ ** 输 出 : NONE
+ ** 全局变量:
+ ** 调用模块:
+ ********************************************************************************************************/
+void module_exit(void)
+{
+ iosDevFileAbnormal(&(sast804_nand_dev.devhdr));
+
+ iosDevDelete(&(sast804_nand_dev.devhdr));
+
+ iosDrvRemove(nand_drv_num, TRUE);
+}
diff --git a/SylixOS/kmodule/mpc750_nand/mpc750_nand_com.h b/SylixOS/kmodule/mpc750_nand/mpc750_nand_com.h
new file mode 100644
index 0000000..9028dfa
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_nand/mpc750_nand_com.h
@@ -0,0 +1,41 @@
+/*********************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM)
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: mpc750_nand_com.h
+**
+** 创 建 人:
+**
+** 文件创建日期: 2018 年 09 月 27 日
+**
+** 描 述: NAND指令驱动
+*********************************************************************************************************/
+
+#ifndef SRC_MPC750_NAND_COM_H_
+#define SRC_MPC750_NAND_COM_H_
+
+#include <sys/ioccom.h>
+
+#define NAND_MRAM_INIT _IOW('x', 528, int) /* NAND MRAM坏块初始化 */
+#define NAND_RD_RESET _IOW('x', 529, int) /* NAND 读计数复位 */
+#define NAND_WR_RESET _IOW('x', 530, int) /* NAND 写计数复位 */
+#define NAND_RD_COUNT _IOW('x', 531, int) /* NAND 读计数 */
+#define NAND_WR_COUNT _IOW('x', 532, int) /* NAND 写计数 */
+#define NAND_PB_START _IOW('x', 533, int) /* NAND 回放开始 */
+#define NAND_PB_STOP _IOW('x', 534, int) /* NAND 回放停止 */
+#define NAND_PB_SET_PAGES _IOW('x', 535, int) /* NAND 回放页面 */
+#define NAND_MODE_YC _IOW('x', 536, int) /* NAND 模式遥测字 */
+#define NAND_RESTORE_BBLOCK _IOW('x', 537, int) /* NAND 恢复坏块表 */
+#define NAND_SWITCH_HM _IOW('x', 538, int) /* NAND 汉明开关 */
+#define NAND_ACQUIRE_HM _IOW('x', 539, int) /* NAND 获取汉明码状态 */
+
+
+#endif /* SRC_MPC750_NAND_COM_H_ */
diff --git a/SylixOS/kmodule/mpc750_rtcs/mpc750_rtc.c b/SylixOS/kmodule/mpc750_rtcs/mpc750_rtc.c
new file mode 100644
index 0000000..773a0f2
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_rtcs/mpc750_rtc.c
@@ -0,0 +1,434 @@
+/*********************************************************************************************************
+ **
+ ** 中国软件开源组织
+ **
+ ** 嵌入式实时操作系统
+ **
+ ** SylixOS(TM)
+ **
+ ** Copyright All Rights Reserved
+ **
+ **--------------文件信息--------------------------------------------------------------------------------
+ **
+ ** 文 件 名: mpc750_rtc.c
+ **
+ ** 创 建 人: Gavin.Bai(白亮)
+ **
+ ** 文件创建日期: 2018 年 09 月 19 日
+ **
+ ** 描 述: RTC 驱动
+ ********************************************************************************************************/
+
+#define __SYLIXOS_KERNEL
+#include <SylixOS.h>
+#include <module.h>
+#include <string.h>
+
+#include "mpc750_rtc_com.h"
+#include "mpc750_rtc.h"
+
+/********************************************************************************************************
+ 定义
+ ********************************************************************************************************/
+extern void rtc_proc_init(void);
+extern void rtc_proc_deinit(void);
+
+#pragma pack(1)
+typedef struct {
+ UINT32 msb;
+ UINT32 lsb;
+} rtc_time_t;
+#pragma pack()
+
+/********************************************************************************************************
+ 定义
+ ********************************************************************************************************/
+#define TIME_LSB (0xA8) /* 系统时钟低32位 */
+#define TIME_MSB (0xAC) /* 系统时钟高16位 */
+#define TIME_ACK (0xB0) /* 系统时钟授时确认 */
+#define TIME_ADJ (0xB4) /* 系统时钟校时 */
+#define TIME_ADJ_ACK (0xB8) /* 系统时钟校时确认 */
+
+#define GPS_SYS_LSB (0xC0) /* GPS系统时钟低32位 */
+#define GPS_SYS_MSB (0xC4) /* GPS系统时钟高16位 */
+
+#define TM_SYS_LSB (0xC8) /* 遥测系统时钟低32位 */
+#define TM_SYS_MSB (0xCC) /* 遥测系统时钟高16位 */
+
+#define SYS_BAK_LSB (0xD0) /* 备用时钟低32位 */
+#define SYS_BAK_MSB (0xD4) /* 备用时钟高16位 */
+
+#define GPS_BAK_LSB (0xD8) /* GPS备用时钟低32位 */
+#define GPS_BAK_MSB (0xDC) /* GPS备用时钟高16位 */
+
+#define TM_BAK_LSB (0xE0) /* 遥测备用时钟低32位 */
+#define TM_BAK_MSB (0xE4) /* 遥测备用时钟高16位 */
+
+#define ACK_CODE (0xFEED)
+
+#define RTC_NR (1)
+
+/*********************************************************************************************************
+ 授时/校时相关定义
+*********************************************************************************************************/
+#define SAST804_FAKE_RTC_BASE (0x30000000)
+#define SAST804_FAKE_RTC_NAME ("/dev/frtc")
+
+/********************************************************************************************************
+ RTC 控制器类型定义
+ ********************************************************************************************************/
+typedef struct {
+ LW_DEV_HDR devhdr;
+ LW_LIST_LINE_HEADER fdnode_header;
+
+ addr_t phy_addr_base; /* 物理地址基地址 */
+ LONG phy_addr_size; /* 物理地址空间大小 */
+ addr_t virt_addr_base; /* 虚拟地址基地址 */
+
+ LW_HANDLE lock;
+} rtc_dev_t;
+
+/********************************************************************************************************
+ RTC设备驱动个数
+ ********************************************************************************************************/
+static UINT32 rtc_drv_num = 0;
+
+/********************************************************************************************************
+ RTC设备实例化
+ ********************************************************************************************************/
+static rtc_dev_t sast804_rtc_dev[RTC_NR];
+uint32_t _version_nm = 0x20010100;
+
+/********************************************************************************************************
+ ** 函数名称: rtc_open
+ ** 功能描述: 打开 RTC 设备
+ ** 输 入 : rtc_devp 设备
+ ** namep 设备名字
+ ** flags 标志
+ ** mode 模式
+ ** 输 出 : 文件节点
+ ********************************************************************************************************/
+static long rtc_open(rtc_dev_t *rtc_devp, char *namep, int flags, int mode)
+{
+ PLW_FD_NODE pfdnode;
+ BOOL is_new;
+
+ if (LW_NULL == namep) {
+ errno = ERROR_IO_NO_DEVICE_NAME_IN_PATH;
+ _ErrorHandle(ERROR_IO_NO_DEVICE_NAME_IN_PATH);
+
+ return (PX_ERROR);
+ } else {
+ pfdnode = API_IosFdNodeAdd(&(rtc_devp->fdnode_header), (dev_t) rtc_devp,
+ 0, flags, mode, 0, 0, 0, LW_NULL, &is_new);
+ if ( LW_NULL == pfdnode) {
+ printk(KERN_ERR "rtc_open(): failed to add fd node\r\n");
+
+ return (PX_ERROR);
+ }
+
+ if ( 0x1 == LW_DEV_INC_USE_COUNT(&(rtc_devp->devhdr))) {
+ rtc_devp->lock = API_SemaphoreMCreate("rtc_lock", LW_PRIO_DEF_CEILING,
+ LW_OPTION_WAIT_PRIORITY | LW_OPTION_INHERIT_PRIORITY
+ | LW_OPTION_DELETE_SAFE | LW_OPTION_OBJECT_GLOBAL,
+ LW_NULL);
+ if ( LW_OBJECT_HANDLE_INVALID == rtc_devp->lock) {
+ printk(KERN_ERR "rtc_open(): create lock for rtc device error\r\n");
+
+ LW_DEV_DEC_USE_COUNT(&(rtc_devp->devhdr));
+ API_IosFdNodeDec(&(rtc_devp->fdnode_header), pfdnode, NULL);
+
+ return (PX_ERROR);
+ }
+
+ return ((long) pfdnode);
+ }
+
+ return ((long) pfdnode);
+ }
+}
+
+/********************************************************************************************************
+ ** 函数名称: rtc_close
+ ** 功能描述: 关闭 RTC 设备
+ ** 输 入 : pRtcDev 设备结构
+ ** 输 出 : ERROR_CODE
+ ********************************************************************************************************/
+static int rtc_close(PLW_FD_ENTRY pfdentry)
+{
+ PLW_FD_NODE pfdnode = (PLW_FD_NODE)pfdentry->FDENTRY_pfdnode;
+ rtc_dev_t *rtc_devp = (rtc_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+
+ if ( pfdentry && pfdnode) {
+
+ if ( 0x0 == LW_DEV_DEC_USE_COUNT(&(rtc_devp->devhdr))) {
+ API_SemaphoreMDelete(&rtc_devp->lock);
+ API_IosFdNodeDec(&(rtc_devp->fdnode_header), pfdnode, NULL);
+ }
+
+ return (ERROR_NONE);
+ } else {
+ return (PX_ERROR);
+ }
+}
+
+/********************************************************************************************************
+ ** 函数名称: rtc_ioctl
+ ** 功能描述: 控制 RTC 设备
+ ** 输 入 : pfdentry 文件结构
+ ** cmd 命令
+ ** arg 参数
+ ** 输 出 : ERROR_CODE
+ ********************************************************************************************************/
+static int rtc_ioctl(PLW_FD_ENTRY pfdentry, int cmd, long arg)
+{
+ rtc_dev_t *rtc_devp = (rtc_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+ int adjust_value = (int)arg;
+ rtc_time_t rtc_value;
+ UINT64 val;
+
+ rtc_value.lsb = 0x0;
+ rtc_value.msb = 0x0;
+
+ switch (cmd) {
+
+ case ADJUST_TIME :
+ API_SemaphoreMPend(rtc_devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ write32(adjust_value, rtc_devp->virt_addr_base + TIME_ADJ); /* 校时值补码 */
+ write32(ACK_CODE, rtc_devp->virt_addr_base + TIME_ADJ_ACK); /* 校时确认 */
+
+ API_SemaphoreMPost(rtc_devp->lock);
+ break;
+
+ case SYS_BAK_TIME_GET:
+ API_SemaphoreMPend(rtc_devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ rtc_value.lsb = read32(rtc_devp->virt_addr_base + SYS_BAK_LSB);
+ rtc_value.msb = read32(rtc_devp->virt_addr_base + SYS_BAK_MSB) & 0xFFFF;
+
+ ((rtc_time_t *)arg)->lsb = rtc_value.lsb;
+ ((rtc_time_t *)arg)->msb = rtc_value.msb;
+
+ API_SemaphoreMPost(rtc_devp->lock);
+ break;
+
+ case GPS_SYS_TIME_GET:
+ API_SemaphoreMPend(rtc_devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ rtc_value.lsb = read32(rtc_devp->virt_addr_base + GPS_SYS_LSB);
+ rtc_value.msb = read32(rtc_devp->virt_addr_base + GPS_SYS_MSB) & 0xFFFF;
+
+ ((rtc_time_t *)arg)->lsb = rtc_value.lsb;
+ ((rtc_time_t *)arg)->msb = rtc_value.msb;
+
+ API_SemaphoreMPost(rtc_devp->lock);
+ break;
+
+ case GPS_BAK_TIME_GET:
+ API_SemaphoreMPend(rtc_devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ rtc_value.lsb = read32(rtc_devp->virt_addr_base + GPS_BAK_LSB);
+ rtc_value.msb = read32(rtc_devp->virt_addr_base + GPS_BAK_MSB) & 0xFFFF;
+
+ ((rtc_time_t *)arg)->lsb = rtc_value.lsb;
+ ((rtc_time_t *)arg)->msb = rtc_value.msb;
+
+ API_SemaphoreMPost(rtc_devp->lock);
+ break;
+
+ case TM_INT_SYS_TIME_GET:
+ API_SemaphoreMPend(rtc_devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ rtc_value.lsb = read32(rtc_devp->virt_addr_base + TM_SYS_LSB);
+ rtc_value.msb = read32(rtc_devp->virt_addr_base + TM_SYS_MSB) & 0xFFFF;
+
+ //val = read64(rtc_devp->virt_addr_base + TM_SYS_LSB);
+
+ ((rtc_time_t *)arg)->lsb = rtc_value.lsb;
+ ((rtc_time_t *)arg)->msb = rtc_value.msb;
+
+ API_SemaphoreMPost(rtc_devp->lock);
+ break;
+
+ case TM_INT_BAK_TIME_GET:
+ API_SemaphoreMPend(rtc_devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ rtc_value.lsb = read32(rtc_devp->virt_addr_base + TM_BAK_LSB);
+ rtc_value.msb = read32(rtc_devp->virt_addr_base + TM_BAK_MSB) & 0xFFFF;
+
+ ((rtc_time_t *)arg)->lsb = rtc_value.lsb;
+ ((rtc_time_t *)arg)->msb = rtc_value.msb;
+
+ API_SemaphoreMPost(rtc_devp->lock);
+ break;
+
+ default:
+ errno = ENOSYS;
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/********************************************************************************************************
+ ** 函数名称: rtc_write
+ ** 功能描述: 驱动 write 函数,实现授时
+ ** 输 入 : pfdentry 文件结构
+ ** bufp 写缓冲
+ ** len 写数据长度
+ ** 输 出 : 成功写入数据字节数量
+ ********************************************************************************************************/
+static ssize_t rtc_write(PLW_FD_ENTRY pfdentry, void *bufp, size_t len)
+{
+ rtc_dev_t *rtc_devp = (rtc_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+ rtc_time_t *rtc_timep = (rtc_time_t *)bufp;
+
+ API_SemaphoreMPend(rtc_devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ write32(rtc_timep->lsb, rtc_devp->virt_addr_base + TIME_LSB);
+ write32(rtc_timep->msb&0xFFFF, rtc_devp->virt_addr_base + TIME_MSB);
+ write32(ACK_CODE, rtc_devp->virt_addr_base + TIME_ACK);
+
+ API_SemaphoreMPost(rtc_devp->lock);
+
+ return (len);
+}
+
+/********************************************************************************************************
+ ** 函数名称: rtc_read
+ ** 功能描述: 驱动 read 函数
+ ** 输 入 : fdentry -- 文件结构
+ ** bufp -- 读缓冲
+ ** len -- 读长度
+ ** 输 出 : 成功读取数据字节数量
+ ********************************************************************************************************/
+static ssize_t rtc_read(PLW_FD_ENTRY pfdentry, void *bufp, size_t len)
+{
+ rtc_dev_t *rtc_devp = (rtc_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+ rtc_time_t val1, val2;
+
+ API_SemaphoreMPend(rtc_devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ do {
+ val1.lsb = read32(rtc_devp->virt_addr_base + TIME_LSB);
+ val1.msb = read32(rtc_devp->virt_addr_base + TIME_MSB);
+
+ val2.lsb = read32(rtc_devp->virt_addr_base + TIME_LSB);
+ val2.msb = read32(rtc_devp->virt_addr_base + TIME_MSB);
+ } while ( (val1.lsb != val2.lsb) && (val1.msb != val2.msb));
+
+ ((rtc_time_t *)bufp)->msb = val1.msb;
+ ((rtc_time_t *)bufp)->lsb = val1.lsb;
+
+ API_SemaphoreMPost(rtc_devp->lock);
+
+ return (len);
+}
+
+/********************************************************************************************************
+ ** 函数名称: rtc_drv
+ ** 功能描述: 安装 RTC 驱动
+ ** 输 入 : NONE
+ ** 输 出 : ERROR_CODE
+ ********************************************************************************************************/
+static int rtc_drv(void)
+{
+ struct file_operations rtc_ops;
+
+ if ( rtc_drv_num) {
+ return (ERROR_NONE);
+ }
+
+ lib_memcpy(&rtc_ops, 0, sizeof(struct file_operations));
+
+ rtc_ops.owner = THIS_MODULE;
+ rtc_ops.fo_create = rtc_open;
+ rtc_ops.fo_open = rtc_open;
+ rtc_ops.fo_close = rtc_close;
+ rtc_ops.fo_ioctl = rtc_ioctl;
+ rtc_ops.fo_read = rtc_read;
+ rtc_ops.fo_write = rtc_write;
+
+ rtc_drv_num = API_IosDrvInstallEx2(&rtc_ops, LW_DRV_TYPE_NEW_1);
+
+ DRIVER_LICENSE(rtc_drv_num, "Dual BSD/GPL ->Ver1.0");
+ DRIVER_AUTHOR(rtc_drv_num, "Gavin.Bai");
+ DRIVER_DESCRIPTION(rtc_drv_num, "RTC Driver");
+
+ return (rtc_drv_num > 0 ? (ERROR_NONE) : (PX_ERROR));
+}
+
+/********************************************************************************************************
+ ** 函数名称: rtc_devadd
+ ** 功能描述: 创建RTC设备
+ ** 输 入 : index -- RTC索引
+ ** 输 出 : ERROR_CODE
+ ********************************************************************************************************/
+int rtc_devadd(UINT32 index)
+{
+ rtc_dev_t *rtc_devp;
+
+ if ( index > RTC_NR) {
+ printk(KERN_ERR "rtc_devadd(): RTC index invalid. \r\n");
+
+ return (PX_ERROR);
+ }
+
+ rtc_devp = &(sast804_rtc_dev[index]);
+ if ( 0x0 == index) {
+ rtc_devp->phy_addr_base = SAST804_FAKE_RTC_BASE;
+ rtc_devp->phy_addr_size = LW_CFG_VMM_PAGE_SIZE;
+ rtc_devp->virt_addr_base = SAST804_FAKE_RTC_BASE;
+ }
+
+ if ( ERROR_NONE != API_IosDevAddEx(&(rtc_devp->devhdr), SAST804_FAKE_RTC_NAME, rtc_drv_num, DT_CHR)) {
+ printk(KERN_ERR "rtc_devadd(): can not add device : %s.\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/********************************************************************************************************
+ ** 函数名称: module_init
+ ** 功能描述: 内核模块加载函数
+ ** 输 入 : NONE
+ ** 输 出 : ERROR_CODE
+ ********************************************************************************************************/
+int module_init(void)
+{
+ rtc_proc_init();
+
+ if ( rtc_drv()) {
+ printk(KERN_ERR "module_init(): can not add RTC device driver : %s.\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ if ( rtc_devadd(0)) {
+ printk(KERN_ERR "module_init(): can not add RTC device : %s.\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/********************************************************************************************************
+ ** 函数名称: module_exit
+ ** 功能描述: 内核模块卸载函数
+ ** 输 入 : NONE
+ ** 输 出 : NONE
+ ********************************************************************************************************/
+void module_exit(void)
+{
+ rtc_proc_deinit();
+
+ iosDevFileAbnormal(&(sast804_rtc_dev[0].devhdr));
+
+ iosDevDelete(&(sast804_rtc_dev[0].devhdr));
+
+ iosDrvRemove(rtc_drv_num, TRUE);
+}
diff --git a/SylixOS/kmodule/mpc750_rtcs/mpc750_rtc.h b/SylixOS/kmodule/mpc750_rtcs/mpc750_rtc.h
new file mode 100644
index 0000000..2b8e1e9
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_rtcs/mpc750_rtc.h
@@ -0,0 +1,26 @@
+/*********************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM)
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: mpc750_rtc.h
+**
+** 创 建 人: Gavin.Bai ()
+**
+** 文件创建日期: 2018 年 09 月 19 日
+**
+** 描 述: RTC 驱动
+*********************************************************************************************************/
+
+#ifndef SRC_MPC750_RTC_H_
+#define SRC_MPC750_RTC_H_
+
+
+#endif /* SRC_MPC750_RTC_H_ */
diff --git a/SylixOS/kmodule/mpc750_rtcs/mpc750_rtc_com.h b/SylixOS/kmodule/mpc750_rtcs/mpc750_rtc_com.h
new file mode 100644
index 0000000..ff99a1c
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_rtcs/mpc750_rtc_com.h
@@ -0,0 +1,39 @@
+/*********************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM)
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: mpc750_rtc_com.h
+**
+** 创 建 人: Gavin.Bai ()
+**
+** 文件创建日期: 2018 年 09 月 19 日
+**
+** 描 述: RTC指令驱动
+*********************************************************************************************************/
+
+#ifndef SRC_MPC750_RTC_COM_H_
+#define SRC_MPC750_RTC_COM_H_
+
+#include <sys/ioccom.h>
+
+#define ADJUST_TIME _IOW('x', 129, int) /* 校时用ioctl()所用命令 */
+
+#define SYS_BAK_TIME_GET _IOW('x', 229, int) /* 备用时钟寄存器 */
+#define GPS_SYS_TIME_GET _IOW('x', 230, int) /* 硬件在GPS秒脉冲下降沿锁存的48
+ 位系统时钟数据 */
+#define GPS_BAK_TIME_GET _IOW('x', 231, int) /* 硬件在GPS秒脉冲下降沿锁存的48
+ 位备用时钟数据 */
+#define TM_INT_SYS_TIME_GET _IOW('x', 232, int) /* 硬件在遥测中断产生时锁存的48
+ 位系统时钟数据 */
+#define TM_INT_BAK_TIME_GET _IOW('x', 234, int) /* 硬件在遥测中断产生时锁存的48
+ 位备用时钟数据 */
+
+#endif /* SRC_MPC750_RTC_COM_H_ */
diff --git a/SylixOS/kmodule/mpc750_rtcs/mpc750_rtc_proc.c b/SylixOS/kmodule/mpc750_rtcs/mpc750_rtc_proc.c
new file mode 100644
index 0000000..77a787b
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_rtcs/mpc750_rtc_proc.c
@@ -0,0 +1,111 @@
+/*********************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM)
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: mpc750_rtc_proc.c
+**
+** 创 建 人: Gavin.Bai ()
+**
+** 文件创建日期: 2018 年 09 月 19 日
+**
+** 描 述: RTC proc信息节点添加
+*********************************************************************************************************/
+
+#define __SYLIXOS_STDIO
+#define __SYLIXOS_KERNEL
+#include <SylixOS.h>
+
+#define FILE_MAX_SZ 1024
+
+typedef struct {
+ int fd;
+ char *dev;
+} com_dev_t;
+
+static com_dev_t *sys_rtc_dev;
+static unsigned int sys_rtc_num = 0;
+/********************************************************************************************************
+ proc文件节点信息
+ ********************************************************************************************************/
+static ssize_t rtc_proc_input_read(PLW_PROCFS_NODE p_pfsn,
+ PCHAR pcBuffer,
+ size_t stMaxBytes,
+ off_t oft);
+
+static LW_PROCFS_NODE_OP rtc_proc_input_funcs = {
+ rtc_proc_input_read, NULL
+};
+
+static LW_PROCFS_NODE rtc_proc[] = {
+ LW_PROCFS_INIT_NODE("rtc",
+ (S_IFREG | S_IRUSR | S_IRGRP | S_IROTH),
+ &rtc_proc_input_funcs, NULL, FILE_MAX_SZ),
+};
+
+static ssize_t rtc_proc_input_read (PLW_PROCFS_NODE p_pfsn,
+ PCHAR pcBuffer,
+ size_t stMaxBytes,
+ off_t oft)
+{
+ static const CHAR hdr[] = \
+ "devices type status\n";
+ PCHAR pcFileBuffer;
+ size_t stRealSize;
+ size_t stCopeBytes;
+
+ pcFileBuffer = (PCHAR)API_ProcFsNodeBuffer(p_pfsn);
+ if ( pcFileBuffer == LW_NULL) {
+ _ErrorHandle(ENOMEM);
+ return (0);
+ }
+
+ stRealSize = API_ProcFsNodeGetRealFileSize(p_pfsn);
+ if ( stRealSize == 0) {
+ int i;
+ com_dev_t *input;
+
+ stRealSize = bnprintf(pcFileBuffer, FILE_MAX_SZ, 0, hdr);
+
+ input = sys_rtc_dev;
+ for (i = 0; i < sys_rtc_num; i++) {
+ stRealSize = bnprintf(pcFileBuffer, FILE_MAX_SZ, stRealSize,
+ "%-23s %-4s %s\n", input->dev, "kbd",
+ (input->fd < 0) ? "close" : "open");
+ input++;
+ }
+
+ API_ProcFsNodeSetRealFileSize(p_pfsn, stRealSize);
+ }
+
+ if ( oft >= stRealSize) {
+ _ErrorHandle(ENOSPC);
+ return (0);
+ }
+
+ stCopeBytes = __MIN(stMaxBytes, (size_t)(stRealSize - oft));
+ lib_memcpy(pcBuffer, (CPVOID)(pcFileBuffer + oft), (UINT)stCopeBytes);
+
+ return ((ssize_t)stCopeBytes);
+}
+
+
+void rtc_proc_init(void)
+{
+ API_ProcFsMakeNode(&rtc_proc[0], "/");
+}
+
+void rtc_proc_deinit(void)
+{
+ if (API_ProcFsRemoveNode(&rtc_proc[0], NULL)) {
+ _DebugHandle(__ERRORMESSAGE_LEVEL, "Serious error: /proc/rtc file busy now, "
+ "the system will become unstable!\r\n");
+ }
+}
diff --git a/SylixOS/kmodule/mpc750_sysstatus/mpc750_sysstatus.c b/SylixOS/kmodule/mpc750_sysstatus/mpc750_sysstatus.c
new file mode 100644
index 0000000..65800fc
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_sysstatus/mpc750_sysstatus.c
@@ -0,0 +1,355 @@
+/*********************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM)
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: mpc75_sysstatus.c
+**
+** 创 建 人: Gavin.Bai ()
+**
+** 文件创建日期: 2018 年 09 月 19 日
+**
+** 描 述: System status 驱动
+*********************************************************************************************************/
+
+#define __SYLIXOS_KERNEL
+#define __SYLIXOS_STDIO
+#include <SylixOS.h>
+#include <module.h>
+#include <string.h>
+
+#include "mpc750_sysstatus_com.h"
+
+/*********************************************************************************************************
+ 定义
+*********************************************************************************************************/
+#define SYS_STATE (0x0)
+#define SYS_0 (0x4)
+#define SYS_1 (0x8)
+#define SYS_2 (0xC)
+
+#define SYS_HEALTH (0x98)
+#define FPGA_VERSION (0x9C)
+#define FPGA_UPDATE (0xA0)
+
+#define SYS_STATE_NR (1)
+
+/*********************************************************************************************************
+ 系统状态获取相关定义
+*********************************************************************************************************/
+#define SAST804_SYS_STATUS_BASE (0x30000000)
+#define SAST804_SYS_STATUS_NAME ("/dev/sysstatus")
+
+/*********************************************************************************************************
+ System status 控制器类型定义
+*********************************************************************************************************/
+typedef struct {
+ LW_DEV_HDR dev_hdr;
+ LW_LIST_LINE_HEADER fd_node_header;
+
+ addr_t phy_addr_base;
+ LONG phy_addr_size;
+ addr_t virt_addr_base;
+
+ LW_HANDLE lock;
+} sysstatus_dev_t;
+
+/*********************************************************************************************************
+ 全局变量
+*********************************************************************************************************/
+static int sysstatus_drv_num = 0;
+static sysstatus_dev_t sast804_sysstatus_dev;
+uint32_t _version_nm = 0x20010100;
+
+/*********************************************************************************************************
+** 函数名称: sysstatus_open
+** 功能描述: 打开 System status 设备
+** 输 入 : devp 设备
+** namep 设备名字
+** flags 标志
+** mode 模式
+** 输 出 : 文件节点
+*********************************************************************************************************/
+static long sysstatus_open(sysstatus_dev_t *devp, char *namep, int flags, int mode)
+{
+ PLW_FD_NODE pfdnode;
+ BOOL is_new;
+
+ if ( LW_NULL == namep) {
+ errno = ERROR_IO_NO_DEVICE_NAME_IN_PATH;
+ _ErrorHandle(ERROR_IO_NO_DEVICE_NAME_IN_PATH);
+
+ return (PX_ERROR);
+ } else {
+ pfdnode = API_IosFdNodeAdd(&(devp->fd_node_header), (dev_t)devp, 0,
+ flags, mode, 0, 0, 0, LW_NULL, &is_new);
+ if ( LW_NULL == pfdnode) {
+ printk(KERN_ERR "sysstatus_open(): failed to add fd node \r\n");
+
+ return (PX_ERROR);
+ }
+
+ if ( 1 == LW_DEV_INC_USE_COUNT(&(devp->dev_hdr)) ) {
+ devp->lock = API_SemaphoreMCreate("sysstatus_lock", LW_PRIO_DEF_CEILING, LW_OPTION_WAIT_PRIORITY |
+ LW_OPTION_INHERIT_PRIORITY | LW_OPTION_DELETE_SAFE |
+ LW_OPTION_OBJECT_GLOBAL, LW_NULL);
+ if ( LW_OBJECT_HANDLE_INVALID == devp->lock) {
+ printk(KERN_ERR "sysstatus_open(): failed to create lock\r\n");
+
+ LW_DEV_DEC_USE_COUNT(&(devp->dev_hdr));
+ API_IosFdNodeDec(&(devp->fd_node_header), pfdnode, NULL);
+
+ return (PX_ERROR);
+ }
+
+ return ((long)pfdnode);
+ }
+
+ return ((long)pfdnode);
+ }
+}
+
+/*********************************************************************************************************
+** 函数名称: sysstatus_close
+** 功能描述: 打开 System status 设备
+** 输 入 : pDev 设备
+** 输 出 : ERROR_NONE
+*********************************************************************************************************/
+static int sysstatus_close(PLW_FD_ENTRY pfdentry)
+{
+ sysstatus_dev_t *devp = (sysstatus_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+ PLW_FD_NODE pfdnode = (PLW_FD_NODE)pfdentry->FDENTRY_pfdnode;
+
+ if ( pfdentry && pfdnode) {
+ if ( 0x0 == LW_DEV_DEC_USE_COUNT(&(devp->dev_hdr)) ) {
+ API_SemaphoreMDelete(&devp->lock);
+ API_IosFdNodeDec(&(devp->fd_node_header), pfdnode, NULL);
+ }
+
+ return (ERROR_NONE);
+ } else {
+ return (PX_ERROR);
+ }
+}
+
+/*********************************************************************************************************
+** 函数名称: sysstatus_ioctl
+** 功能描述: 控制 System Status 设备
+** 输 入 : pfdentry 文件结构
+** cmd 命令
+** arg 参数
+** 输 出 : ERROR_CODE
+*********************************************************************************************************/
+static int sysstatus_ioctl(PLW_FD_ENTRY pfdentry, int cmd, long arg)
+{
+ sysstatus_dev_t *devp = (sysstatus_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+ int value = 0;
+ UINT32 tmp = 0;
+
+ switch (cmd) {
+
+ case SYS_CAN_RST :
+ API_SemaphoreMPend(devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ /* 先置为'0' */
+ value = read32(devp->virt_addr_base + SYS_0);
+ value |= (0x2B << 8);
+ value &= ~(0xF << 0);
+ write32(value, devp->virt_addr_base + SYS_0);
+ write32(value, devp->virt_addr_base + SYS_1);
+ write32(value, devp->virt_addr_base + SYS_2);
+
+ /* 后置为'1' */
+ value = read32(devp->virt_addr_base + SYS_0);
+ value |= (0x2B << 8);
+ value |= (0xF << 0);
+ write32(value, devp->virt_addr_base + SYS_0);
+ write32(value, devp->virt_addr_base + SYS_1);
+ write32(value, devp->virt_addr_base + SYS_2);
+
+ API_SemaphoreMPost(devp->lock);
+
+ return (ERROR_NONE);
+ break;
+
+ case SYS_FPGA_VER:
+ API_SemaphoreMPend(devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ value = read32(devp->virt_addr_base + FPGA_VERSION);
+ *((int *)arg) = value;
+
+ API_SemaphoreMPost(devp->lock);
+ break;
+
+ case SYS_FPGA_UP:
+ API_SemaphoreMPend(devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ tmp = read32(devp->virt_addr_base + FPGA_UPDATE);
+ *((UINT32 *)arg) = tmp;
+
+ API_SemaphoreMPost(devp->lock);
+ break;
+
+ case SYS_HEALTH_SET:
+ API_SemaphoreMPend(devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ tmp = (UINT32)arg;
+ write32(tmp, devp->virt_addr_base + SYS_HEALTH);
+
+ API_SemaphoreMPost(devp->lock);
+ break;
+
+ default:
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: sysstatus_read
+** 功能描述: 驱动 read 函数,读取状态
+** 输 入 : pfdentry 文件结构
+** bufp 写缓冲
+** len 写数据长度
+** 输 出 : 成功读取的数据字节数量
+*********************************************************************************************************/
+static ssize_t sysstatus_read(PLW_FD_ENTRY pfdentry, void *bufp, size_t len)
+{
+ sysstatus_dev_t *devp = (sysstatus_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+ UINT32 value1, value2;
+
+ API_SemaphoreMPend(devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ value1 = value2 = 0;
+
+ /* 采取滤波功能,直到前后两次读取的数据一致时才返回,否则认为系统状态不正确 */
+ do {
+ value1 = read32(devp->virt_addr_base + SYS_STATE);
+ value2 = read32(devp->virt_addr_base + SYS_STATE);
+ } while (value1 != value2 );
+
+ *((UINT32 *)bufp) = value1;
+
+ len = sizeof(UINT32);
+
+ API_SemaphoreMPost(devp->lock);
+
+ return (len);
+}
+
+/*********************************************************************************************************
+** 函数名称: sysstatus_write
+** 功能描述: 驱动 write 函数
+** 输 入 : pfdentry 文件结构
+** bufp 写缓冲
+** len 写数据长度
+** 输 出 : 成功写入数据字节数量
+*********************************************************************************************************/
+static ssize_t sysstatus_write(PLW_FD_ENTRY pfdentry, void *bufp, size_t len)
+{
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: sysstatus_drv
+** 功能描述: 安装 System Status 驱动
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+*********************************************************************************************************/
+int sysstatus_drv(void)
+{
+ struct file_operations filops;
+
+ if ( sysstatus_drv_num) {
+ return (ERROR_NONE);
+ }
+
+ lib_memcpy(&filops, 0, sizeof(struct file_operations));
+
+ filops.owner = THIS_MODULE;
+ filops.fo_create = sysstatus_open;
+ filops.fo_open = sysstatus_open;
+ filops.fo_close = sysstatus_close;
+ filops.fo_ioctl = sysstatus_ioctl;
+ filops.fo_read = sysstatus_read;
+ filops.fo_write = sysstatus_write;
+
+ sysstatus_drv_num = API_IosDrvInstallEx2(&filops, LW_DRV_TYPE_NEW_1);
+
+ DRIVER_LICENSE(sysstatus_drv_num, "Dual BSD/GPL ->Ver1.0");
+ DRIVER_AUTHOR(sysstatus_drv_num, "Gavin.Bai");
+ DRIVER_DESCRIPTION(sysstatus_drv_num, "System Status Driver");
+
+ return (sysstatus_drv_num > 0 ? (ERROR_NONE) : (PX_ERROR));
+}
+
+/*********************************************************************************************************
+** 函数名称: sysstatus_devadd
+** 功能描述: 创建System Status设备
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+*********************************************************************************************************/
+int sysstatus_devadd(void)
+{
+ sysstatus_dev_t *devp;
+
+ devp = &sast804_sysstatus_dev;
+ devp->phy_addr_base = SAST804_SYS_STATUS_BASE;
+ devp->phy_addr_size = LW_CFG_VMM_PAGE_SIZE;
+ devp->virt_addr_base = SAST804_SYS_STATUS_BASE;
+
+ if ( ERROR_NONE != API_IosDevAddEx(&(devp->dev_hdr), SAST804_SYS_STATUS_NAME, sysstatus_drv_num, DT_CHR)) {
+ printk(KERN_ERR "sysstatus_devadd(): can not add device: %s \r\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: module_init
+** 功能描述: 创建System Status设备
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+*********************************************************************************************************/
+int module_init(void)
+{
+ if ( sysstatus_drv()) {
+ printk(KERN_ERR "module_init(): can not add SYSSTATUS device driver : %s.\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ if ( sysstatus_devadd()) {
+ printk(KERN_ERR "module_init(): can not add SYSSTATUS device : %s.\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: module_exit
+** 功能描述: 创建System Status设备
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+*********************************************************************************************************/
+void module_exit(void)
+{
+ iosDevFileAbnormal(&(sast804_sysstatus_dev.dev_hdr));
+
+ iosDevDelete(&(sast804_sysstatus_dev.dev_hdr));
+
+ iosDrvRemove(sysstatus_drv_num, TRUE);
+}
+
diff --git a/SylixOS/kmodule/mpc750_sysstatus/mpc750_sysstatus_com.h b/SylixOS/kmodule/mpc750_sysstatus/mpc750_sysstatus_com.h
new file mode 100644
index 0000000..d00fbd1
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_sysstatus/mpc750_sysstatus_com.h
@@ -0,0 +1,32 @@
+/*********************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM)
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: mpc750_rtc_com.h
+**
+** 创 建 人: Gavin.Bai ()
+**
+** 文件创建日期: 2018 年 09 月 19 日
+**
+** 描 述: system status指令驱动
+*********************************************************************************************************/
+
+#ifndef SRC_MPC750_SYSTATUS_COM_H_
+#define SRC_MPC750_SYSTATUS_COM_H_
+
+#include <sys/ioccom.h>
+
+#define SYS_CAN_RST _IOW('x', 140, int)
+#define SYS_FPGA_VER _IOW('x', 142, int)
+#define SYS_FPGA_UP _IOW('x', 143, int)
+#define SYS_HEALTH_SET _IOW('x', 144, int)
+
+#endif /* SRC_MPC750_SYSTATUS_COM_H_ */
diff --git a/SylixOS/kmodule/mpc750_tc/mpc750_tc.c b/SylixOS/kmodule/mpc750_tc/mpc750_tc.c
new file mode 100644
index 0000000..565f0a4
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_tc/mpc750_tc.c
@@ -0,0 +1,298 @@
+#define __SYLIXOS_KERNEL
+#define __SYLIXOS_STDIO
+#include <SylixOS.h>
+#include <module.h>
+#include <string.h>
+
+/*********************************************************************************************************
+ 定义
+*********************************************************************************************************/
+#define CNT_OFF (0x0)
+#define CLR_OFF (0x4)
+
+#define TC_RX_BUF_MAX (512)
+#define TC_TX_BUF_MAX (512)
+
+/*********************************************************************************************************
+ 遥控相关定义
+*********************************************************************************************************/
+#define SAST804_TC_DEV ("/dev/ttyTC")
+#define SAST804_TC_NR (2)
+#define SAST804_TC_BUF_SIZE (512)
+
+#define SAST804_TC_A_VECTOR (19)
+#define SAST804_TC_A_BASE (0x30000088)
+#define SAST804_TC_A_BUF (0x10002000) /* 原0x10001C00 */
+
+#define SAST804_TC_B_VECTOR (20)
+#define SAST804_TC_B_BASE (0x30000090)
+#define SAST804_TC_B_BUF (0x10002400) /* 原0x10002000 */
+
+#define container_of(ptr, type, member) ({ \
+ const typeof( ((type *)0)->member ) *__mptr = (ptr); \
+ (type *)( (char *)__mptr - offsetof(type,member) );})
+
+/*********************************************************************************************************
+ UART SIO 通道控制块类型定义
+*********************************************************************************************************/
+typedef struct {
+ addr_t phy_addr_base; /* 物理地址基地址 */
+ size_t phy_addr_size; /* 物理地址空间大小 */
+ addr_t virt_addr_base; /* 虚拟地址基地址 */
+ ULONG rx_vector; /* 接收中断向量 */
+
+ SIO_CHAN chan; /* SIO 通信 */
+
+ INT (*get_tx_char)(); /* 中断回调函数 */
+ INT (*put_rx_char)();
+
+ PVOID get_tx_arg; /* 回调函数参数 */
+ PVOID put_rx_arg;
+
+ addr_t phy_buf_base;
+} tc_uart_dev_t;
+typedef tc_uart_dev_t *ptc_uart_dev_t; /* 指针类型 */
+
+/*********************************************************************************************************
+ UART SIO 通道控制块数组定义
+*********************************************************************************************************/
+static tc_uart_dev_t sast804_tc_uart_channels[SAST804_TC_NR] = {
+ {
+ SAST804_TC_A_BASE,
+ LW_CFG_VMM_PAGE_SIZE,
+ SAST804_TC_A_BASE,
+ SAST804_TC_A_VECTOR,
+ },
+
+#if SAST804_TC_NR > 1
+ {
+ SAST804_TC_B_BASE,
+ LW_CFG_VMM_PAGE_SIZE,
+ SAST804_TC_B_BASE,
+ SAST804_TC_B_VECTOR,
+ },
+#endif
+};
+
+/*********************************************************************************************************
+** 函数名称: tc_sio_cb_install
+** 功能描述: SIO 通道安装回调函数
+** 输 入 : psiochan SIO 通道
+** iCallbackType 回调类型
+** callbackRoute 回调函数
+** pvCallbackArg 回调参数
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static int tc_sio_cb_install(SIO_CHAN *sio_chanp,
+ int callback_type,
+ VX_SIO_CALLBACK callback_route,
+ void * callback_arg)
+{
+ ptc_uart_dev_t ptc_chan = container_of(sio_chanp, tc_uart_dev_t, chan);
+
+ switch (callback_type) {
+
+ case SIO_CALLBACK_GET_TX_CHAR: /* 发送回电函数 */
+ ptc_chan->get_tx_char = callback_route;
+ ptc_chan->get_tx_arg = callback_arg;
+ return (ERROR_NONE);
+
+ case SIO_CALLBACK_PUT_RCV_CHAR: /* 接收回电函数 */
+ ptc_chan->put_rx_char = callback_route;
+ ptc_chan->put_rx_arg = callback_arg;
+ return (ERROR_NONE);
+
+ default:
+ _ErrorHandle(ENOSYS);
+ return (PX_ERROR);
+ }
+}
+
+/*********************************************************************************************************
+** 函数名称: tc_rx_isr
+** 功能描述: SIO 通道接收中断服务函数
+** 输 入 : puartsiochan SIO 通道
+** ulVector 中断向量
+** 输 出 : 中断返回值
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static irqreturn_t tc_rx_isr(ptc_uart_dev_t ptc_chan, ULONG vector)
+{
+ char buf[SAST804_TC_BUF_SIZE];
+ int i, j;
+ int cnt;
+ int size;
+
+ cnt = read32(ptc_chan->phy_addr_base + CNT_OFF);
+ size = min(cnt, SAST804_TC_BUF_SIZE);
+
+ for (i = 0; i < size; i++) {
+ buf[i] = read8(ptc_chan->phy_buf_base + i);
+ }
+ write32(0x55AA, ptc_chan->phy_addr_base + CLR_OFF);
+
+ if ( i > 0) {
+ for (j = 0; j < i; j++) {
+ ptc_chan->put_rx_char(ptc_chan->put_rx_arg, buf[j]);
+ }
+ }
+
+ return (LW_IRQ_HANDLED);
+}
+
+/*********************************************************************************************************
+** 函数名称: tc_sio_ioctl
+** 功能描述: SIO 通道控制
+** 输 入 : psiochan SIO 通道
+** iCmd 命令
+** lArg 参数
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static int tc_sio_ioctl(SIO_CHAN *sio_chanp, int cmd, long arg)
+{
+ ptc_uart_dev_t ptc_chan = container_of(sio_chanp, tc_uart_dev_t, chan);
+ int channel = ptc_chan - sast804_tc_uart_channels;
+ char name[64];
+
+ switch (cmd) {
+
+ case SIO_OPEN: /* 打开串口 */
+ snprintf(name, sizeof(name), "tc%d_rx_isr", channel);
+ API_InterVectorConnect(ptc_chan->rx_vector,
+ (PINT_SVR_ROUTINE)tc_rx_isr,
+ (PVOID)ptc_chan,
+ name);
+
+ API_InterVectorEnable(ptc_chan->rx_vector);
+ break;
+
+ case SIO_HUP: /* 关闭串口 */
+ API_InterVectorDisable(ptc_chan->rx_vector);
+
+ API_InterVectorDisconnect(ptc_chan->rx_vector,
+ (PINT_SVR_ROUTINE)tc_rx_isr,
+ (PVOID)ptc_chan);
+ break;
+
+ default:
+ _ErrorHandle(ENOSYS);
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+ UART SIO 驱动程序
+*********************************************************************************************************/
+static SIO_DRV_FUNCS sast804_tc_drv_funcs = {
+ (INT (*)(SIO_CHAN *,int, void *))tc_sio_ioctl,
+ NULL,
+ tc_sio_cb_install,
+ NULL,
+ NULL
+};
+
+/*********************************************************************************************************
+** 函数名称: tc_devadd
+** 功能描述: 创建SIO 设备
+** 输 入 : channel 通道号
+** 输 出 : 设备引用
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+SIO_CHAN *tc_devadd(int32_t channel)
+{
+ ptc_uart_dev_t ptc_chan;
+
+ if ( channel >= SAST804_TC_NR) {
+ return (NULL); /* 通道号错误 */
+ }
+
+ ptc_chan = &sast804_tc_uart_channels[channel];
+
+ if ( 0 == channel) {
+ ptc_chan->phy_buf_base = SAST804_TC_A_BUF;
+ } else if ( 1 == channel) {
+ ptc_chan->phy_buf_base = SAST804_TC_B_BUF;
+ }
+
+ ptc_chan->chan.pDrvFuncs = &sast804_tc_drv_funcs; /* SIO FUNC */
+
+ return (&ptc_chan->chan);
+}
+
+/*********************************************************************************************************
+** 函数名称: module_init
+** 功能描述: 内核模块加载函数
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+int module_init(void)
+{
+ SIO_CHAN *psio = NULL;
+ int ret;
+
+ psio = tc_devadd(0);
+ if ( !psio) {
+ printk(KERN_ERR "module_init(): create TC0 error: %s\r\n", strerror(errno));
+
+ return (-1);
+ }
+ ret = ttyDevCreate("/dev/ttyTC0", psio, TC_RX_BUF_MAX, TC_TX_BUF_MAX);
+ if ( PX_ERROR == ret) {
+ printk(KERN_ERR "module init(): add TC0 error: %s\r\n", strerror(errno));
+
+ return (-1);
+ }
+
+ psio = tc_devadd(1);
+ if ( !psio) {
+ printk(KERN_ERR "module_init(): create TC1 error: %s\r\n", strerror(errno));
+
+ return (-1);
+ }
+
+ ret = ttyDevCreate("/dev/ttyTC1", psio, TC_RX_BUF_MAX, TC_TX_BUF_MAX);
+ if ( PX_ERROR == ret) {
+ printk(KERN_ERR "module_init(): add TC1 error: %s\r\n", strerror(errno));
+
+ return (-1);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: module_exit
+** 功能描述: 内核模块卸载函数
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+void module_exit(void)
+{
+ int ret;
+
+ ret = API_TtyDevRemove("/dev/ttyTC0", LW_FALSE);
+ if ( ERROR_NONE != ret) {
+ printk(KERN_ERR "module_exit(): remove ttyTC0 error: %s\r\n", strerror(errno));
+
+ return ;
+ }
+
+ ret = API_TtyDevRemove("/dev/ttyTC1", LW_FALSE);
+ if ( ERROR_NONE != ret) {
+ printk(KERN_ERR "module_exit(): remove ttyTC1 error: %s\r\n", strerror(errno));
+
+ return ;
+ }
+}
diff --git a/SylixOS/kmodule/mpc750_tm/mpc750_tm.c b/SylixOS/kmodule/mpc750_tm/mpc750_tm.c
new file mode 100644
index 0000000..f064b82
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_tm/mpc750_tm.c
@@ -0,0 +1,432 @@
+/*********************************************************************************************************
+ **
+ ** 中国软件开源组织
+ **
+ ** 嵌入式实时操作系统
+ **
+ ** SylixOS(TM)
+ **
+ ** Copyright All Rights Reserved
+ **
+ **--------------文件信息--------------------------------------------------------------------------------
+ **
+ ** 文 件 名: mpc750_tm.c
+ **
+ ** 创 建 人: Gavin.Bai
+ **
+ ** 文件创建日期: 2018 年 09 月 19 日
+ **
+ ** 描 述: TM 驱动
+ ********************************************************************************************************/
+
+#define __SYLIXOS_KERNEL
+#define __SYLIXOS_STDIO
+#include <SylixOS.h>
+#include <module.h>
+#include <string.h>
+
+#define __TM_TX_BUF1 (0x10001800) /* 遥测缓冲区1基地址 */
+#define __TM_TX_BUF2 (0x10001A00) /* 遥测缓冲区2基地址 */
+#define __TM_TX_BUF3 (0x10001C00) /* 遥测缓冲区3基地址 */
+#define __TM_TX_BUF4 (0x10001E00) /* 遥测缓冲区3基地址 */
+
+#define __TM_TX_BUF_MID (0x200)
+
+#define TM_CLR (0x0)
+#define TM_PTR (0x4)
+#define TM_HEAD (0x352EF853) /* 0x352EF853 算头256字节 */
+
+/*********************************************************************************************************
+ 遥测相关定义
+*********************************************************************************************************/
+#define SAST804_TM_VECTOR (18)
+#define SAST804_TM_BASE (0x30000080)
+#define SAST804_TM_DEV ("/dev/ttyTM")
+
+#define SAST804_INT_STATUS_REG (0x30300000)
+#define SAST804_INT_CLEAR(vector) write32(1 << vector, SAST804_INT_STATUS_REG)
+
+/*********************************************************************************************************
+ FAKE_TM 控制器类型定义
+*********************************************************************************************************/
+typedef struct {
+ LW_DEV_HDR dev_hdr;
+ LW_LIST_LINE_HEADER fdnode_header;
+ addr_t phy_addr_base;
+ addr_t phy_addr_size;
+ addr_t virt_addr_base;
+ ULONG vector;
+
+ LW_SPINLOCK_DEFINE (slock);
+
+ LW_SEL_WAKEUPLIST selwul_list; /* select() 等待链 */
+} tm_dev_t;
+
+static UINT32 tm_drv_num = 0;
+static tm_dev_t sast804_tm_dev;
+static UINT32 _G_tm_isr_cnt = 0;
+uint32_t _version_nm = 0x20010100;
+
+/*********************************************************************************************************
+** 函数名称: tm_isr
+** 功能描述: TM设备中断服务函数
+** 输 入 : tm_devp 设备
+** vector 中断矢量
+** 输 出 : 中断执行结果
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static irqreturn_t tm_isr(tm_dev_t *tm_devp, ULONG vector)
+{
+ INTREG intreg;
+
+ LW_SPIN_LOCK_QUICK(&tm_devp->slock, &intreg);
+ SAST804_INT_CLEAR(vector);
+ _G_tm_isr_cnt++;
+ SEL_WAKE_UP_ALL(&tm_devp->selwul_list, SELREAD);
+
+ LW_SPIN_UNLOCK_QUICK(&tm_devp->slock, intreg);
+
+ return (LW_IRQ_HANDLED);
+}
+
+/*********************************************************************************************************
+** 函数名称: tm_open
+** 功能描述: 打开 TM 设备
+** 输 入 : tm_devp 设备
+** namep 设备名字
+** flags 标志
+** imode 模式
+** 输 出 : 文件节点
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static long tm_open(tm_dev_t *tm_devp, char *namep, int flags, int mode)
+{
+ PLW_FD_NODE pfdnode;
+ BOOL is_new;
+ char cName[64];
+
+ if ( LW_NULL == namep) {
+ errno = ERROR_IO_NO_DEVICE_NAME_IN_PATH;
+ _ErrorHandle(ERROR_IO_NO_DEVICE_NAME_IN_PATH);
+
+ return (PX_ERROR);
+ } else {
+
+ pfdnode = API_IosFdNodeAdd(&tm_devp->fdnode_header, (dev_t)tm_devp, 0,
+ flags, mode, 0, 0, 0, LW_NULL, &is_new);
+ if ( LW_NULL == pfdnode) {
+ printk(KERN_ERR "tm_open(): failed to add TM fd node!\n");
+
+ return (PX_ERROR);
+ }
+
+ if ( 1 == LW_DEV_INC_USE_COUNT(&tm_devp->dev_hdr)) {
+ snprintf(cName, sizeof(cName), "tm_tx_isr");
+ API_InterVectorConnect(tm_devp->vector,
+ (PINT_SVR_ROUTINE)tm_isr,
+ (PVOID)tm_devp,
+ cName);
+ API_InterVectorEnable(tm_devp->vector);
+ write32(0x1, 0x300000F8);
+ write32(0x55AA, tm_devp->virt_addr_base + TM_CLR);
+
+ return ((LONG)pfdnode);
+ }
+
+ return ((long)pfdnode);
+ }
+}
+
+/*********************************************************************************************************
+** 函数名称: tm_close
+** 功能描述: 关闭 TM 设备
+** 输 入 : pfdentry 文件结构
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static int tm_close(PLW_FD_ENTRY pfdentry)
+{
+ tm_dev_t *tm_devp = (tm_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+ PLW_FD_NODE pfdnode = (PLW_FD_NODE)pfdentry->FDENTRY_pfdnode;
+
+ if ( pfdentry && pfdnode) {
+ if ( LW_DEV_DEC_USE_COUNT(&tm_devp->dev_hdr) == 0) {
+
+ API_InterVectorDisable(tm_devp->vector);
+ API_IosFdNodeDec(&tm_devp->fdnode_header, pfdnode, LW_NULL);
+ }
+
+ return (ERROR_NONE);
+ }
+
+ return (PX_ERROR);
+}
+
+/*********************************************************************************************************
+** 函数名称: tm_write
+** 功能描述: 驱动 write 函数,
+** 输 入 : pfdentry
+** bufp 写缓冲
+** len 写数据长度
+** 输 出 : 成功写入数据字节数量
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static ssize_t tm_write(PLW_FD_ENTRY pfdentry, void *bufp, size_t len)
+{
+ addr_t base;
+ tm_dev_t *tm_devp = (tm_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+ size_t i;
+ unsigned char *p_buf = (unsigned char *)bufp;
+ unsigned int val;
+ int cnt;
+ unsigned int div = 0;
+ unsigned int left = 0;
+ unsigned int *buf32 = (unsigned int *)bufp;
+ INTREG intreg;
+
+ LW_SPIN_LOCK_QUICK(&tm_devp->slock, &intreg);
+ val = (read32(tm_devp->virt_addr_base + TM_PTR) >> 9) & 0x3;
+ if ( 0x0 == val) {
+ base = __TM_TX_BUF3;
+ } else if ( 0x1 == val) {
+ base = __TM_TX_BUF4;
+ } else if ( 0x2 == val) {
+ base = __TM_TX_BUF1;
+ } else if ( 0x3 == val) {
+ base = __TM_TX_BUF2;
+ }
+
+ cnt = (len > 512) ? 512 : len;
+ div = cnt / 4;
+ left = cnt % 4;
+ cnt = 0;
+ while ( cnt < div) {
+ write32(*buf32, base + (cnt<<2));
+ ++cnt;
+ ++buf32;
+ }
+ if ( left) {
+ for (i = 0; i < left; ++i) {
+ write8(*(p_buf + (cnt<<2) + i), base + (cnt<<2) + i);
+ }
+ }
+
+ LW_SPIN_UNLOCK_QUICK(&tm_devp->slock, intreg);
+
+ return (cnt);
+}
+
+/*********************************************************************************************************
+** 函数名称: tm_read
+** 功能描述: 驱动 read 函数
+** 输 入 :
+** 输 出 : 成功读取数据字节数量
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static ssize_t tm_read(PLW_FD_ENTRY pfdentry, void *bufp, size_t len)
+{
+ UINT32 *pValue = (UINT32 *)bufp;
+
+ if ( !pfdentry || !bufp) {
+ _ErrorHandle(EINVAL);
+
+ return (PX_ERROR);
+ }
+
+ *pValue = _G_tm_isr_cnt;
+
+ return (sizeof(UINT32));
+}
+
+/*********************************************************************************************************
+** 函数名称: __selTmAdd
+** 功能描述:
+** 输 入 :
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static void __selTmAdd (tm_dev_t *tm_devp, long arg)
+{
+ REGISTER PLW_SEL_WAKEUPNODE pselnode = (PLW_SEL_WAKEUPNODE)arg;
+
+ SEL_WAKE_NODE_ADD(&tm_devp->selwul_list, pselnode); /* 添加节点 */
+
+ switch (pselnode->SELWUN_seltypType) {
+
+ case SELREAD:
+
+ break;
+ default:
+
+ printk("other select type-%d\r\n", pselnode->SELWUN_seltypType);
+ }
+}
+
+/*********************************************************************************************************
+** 函数名称: __selTmDelete
+** 功能描述:
+** 输 入 :
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static void __selTmDelete(tm_dev_t *tm_devp, long arg)
+{
+ SEL_WAKE_NODE_DELETE(&tm_devp->selwul_list, (PLW_SEL_WAKEUPNODE)arg);
+}
+
+/*********************************************************************************************************
+** 函数名称: tm_ioctl
+** 功能描述: 设备 TM 控制函数
+** 输 入 :
+** 输 出 : error_code
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static int tm_ioctl(PLW_FD_ENTRY pfdentry, int cmd, long arg)
+{
+ tm_dev_t *tm_devp = (tm_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+
+ switch (cmd) {
+
+ case FIOSELECT: /* tm FIOSELECT 处理 */
+ __selTmAdd(tm_devp, arg);
+ return (ERROR_NONE);
+ break;
+
+ case FIOUNSELECT: /* tm FIOUNSELECT 处理 */
+ __selTmDelete(tm_devp, arg);
+ break;
+
+ default:
+ errno = ENOSYS;
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: tm_drv
+** 功能描述: 安装 TM 驱动
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+int tm_drv(void)
+{
+ struct file_operations fileop;
+
+ if ( tm_drv_num) {
+ return (ERROR_NONE);
+ }
+
+ lib_memset(&fileop, 0, sizeof(struct file_operations));
+
+ fileop.owner = THIS_MODULE;
+ fileop.fo_create = tm_open;
+ fileop.fo_open = tm_open;
+ fileop.fo_close = tm_close;
+ fileop.fo_ioctl = tm_ioctl;
+ fileop.fo_write = tm_write;
+ fileop.fo_read = tm_read;
+
+ tm_drv_num = iosDrvInstallEx2(&fileop, LW_DRV_TYPE_NEW_1);
+
+ DRIVER_LICENSE(tm_drv_num, "Dual BSD/GPL->Ver 1.0");
+ DRIVER_AUTHOR(tm_drv_num, "Gavin.Bai");
+ DRIVER_DESCRIPTION(tm_drv_num, "TM driver.");
+
+ return (tm_drv_num > 0) ? (ERROR_NONE) : (PX_ERROR);
+}
+
+#define MSG_MAX_SIZE (4)
+/*********************************************************************************************************
+** 函数名称: tm_devadd
+** 功能描述: 创建 TM 设备
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+int tm_devadd(void)
+{
+ tm_dev_t *tm_devp;
+
+ tm_devp = &sast804_tm_dev;
+
+ tm_devp->phy_addr_base = SAST804_TM_BASE;
+ tm_devp->phy_addr_base = LW_CFG_VMM_PAGE_SIZE;
+ tm_devp->virt_addr_base = SAST804_TM_BASE;
+ tm_devp->vector = SAST804_TM_VECTOR;
+
+ SEL_WAKE_UP_LIST_INIT(&tm_devp->selwul_list);
+
+ LW_SPIN_INIT(&tm_devp->slock);
+
+ if ( ERROR_NONE != API_IosDevAddEx(&tm_devp->dev_hdr, SAST804_TM_DEV, tm_drv_num, DT_CHR)) {
+ printk(KERN_ERR "tm_devadd(): can not add TM device : %s.\n", strerror(errno));
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: module_init
+** 功能描述: 内核模块加载函数
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+int module_init(void)
+{
+ if ( tm_drv()) {
+ printk(KERN_ERR "module_init(): add device driver for TM fail: %s\r\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ if ( tm_devadd()) {
+ printk(KERN_ERR "module_init(): add device TM fail: %s\r\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: module_exit
+** 功能描述: 内核模块卸载函数
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+void module_exit(void)
+{
+ if ( LW_DEV_GET_USE_COUNT(&sast804_tm_dev.dev_hdr)) {
+ _DebugHandle(__ERRORMESSAGE_LEVEL, "too many open files.\r\n");
+ _ErrorHandle(EBUSY);
+ }
+ if ( SEL_WAKE_UP_LIST_LEN(&sast804_tm_dev.selwul_list) > 0) {
+ errno = EBUSY;
+ }
+
+ iosDevFileAbnormal(&(sast804_tm_dev.dev_hdr));
+
+ iosDevDelete(&(sast804_tm_dev.dev_hdr));
+
+ iosDrvRemove(tm_drv_num, TRUE);
+
+ SEL_WAKE_UP_LIST_TERM(&sast804_tm_dev.selwul_list);
+}
diff --git a/SylixOS/kmodule/mpc750_vote/mpc750_vote.c b/SylixOS/kmodule/mpc750_vote/mpc750_vote.c
new file mode 100644
index 0000000..e81dd77
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_vote/mpc750_vote.c
@@ -0,0 +1,328 @@
+/*********************************************************************************************************
+ **
+ ** 中国软件开源组织
+ **
+ ** 嵌入式实时操作系统
+ **
+ ** SylixOS(TM)
+ **
+ ** Copyright All Rights Reserved
+ **
+ **--------------文件信息--------------------------------------------------------------------------------
+ **
+ ** 文 件 名: mpc750_vote.c
+ **
+ ** 创 建 人: Gavin.Ba
+ **
+ ** 文件创建日期: 2018 年 09 月 19 日
+ **
+** 描 述: 切权驱动,切权的使用流程为:
+** int fd;
+** fd = open("/dev/vote", O_RDWR, 0666);
+** ret = ioctl(fd, VOTESWITCH);
+** if ( ret < 0) {
+** fprintf(stderr, "vote error\r\n");
+** }
+ ********************************************************************************************************/
+#define __SYLIXOS_KERNEL
+#include <SylixOS.h>
+#include <module.h>
+#include <string.h>
+
+#include "mpc750_vote_com.h"
+
+#define container_of(ptr, type, member) ({ \
+ const typeof( ((type *)0)->member ) *__mptr = (ptr); \
+ (type *)( (char *)__mptr - offsetof(type,member) );})
+
+/*********************************************************************************************************
+ 切权 寄存器定义
+*********************************************************************************************************/
+#define VOTE_TIMES (100)
+
+#define SVOTE_CMD (0x55AA) /* 切权值 */
+
+#define VOTE_STAT (0x8)
+#define HAS_VOTE (0x1)
+
+/*********************************************************************************************************
+ 切权相关定义
+*********************************************************************************************************/
+#define SAST804_VOTE_BASE (0x30000124)
+#define SAST804_STAT_BASE (0x30000000)
+#define SAST804_VOTE_DEV ("/dev/vote")
+
+/*********************************************************************************************************
+ VOTE 控制器类型定义
+*********************************************************************************************************/
+typedef struct {
+ LW_DEV_HDR dev_hdr;
+ LW_LIST_LINE_HEADER fdnode_header;
+ addr_t phy_addr_base;
+ addr_t phy_addr_size;
+ addr_t virt_addr_base;
+
+ LW_HANDLE lock;
+} vote_dev_t;
+
+static unsigned int vote_drv_num = 0;
+static vote_dev_t sast804_vote_dev;
+uint32_t _version_nm = 0x20010100;
+
+/*********************************************************************************************************
+** 函数名称: vote_open
+** 功能描述: 打开 VOTE 设备
+** 输 入 : vote_devp 设备
+** namep 设备名字
+** flags 标志
+** mode 模式
+** 输 出 : 文件节点
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static long vote_open(vote_dev_t *vote_devp, char *namep, int flags, int mode)
+{
+ PLW_FD_NODE pfdnode;
+ BOOL is_new;
+
+ if ( LW_NULL == namep) {
+ errno = ERROR_IO_NO_DEVICE_NAME_IN_PATH;
+ _ErrorHandle(ERROR_IO_NO_DEVICE_NAME_IN_PATH);
+
+ return (PX_ERROR);
+ } else {
+
+ pfdnode = API_IosFdNodeAdd(&vote_devp->fdnode_header, (dev_t)vote_devp, 0,
+ flags, mode, 0, 0, 0, LW_NULL, &is_new);
+ if ( LW_NULL == pfdnode) {
+ printk(KERN_ERR "vote_open(): failed to add vote fd node!\n");
+
+ return (PX_ERROR);
+ }
+
+ if ( 1 == LW_DEV_INC_USE_COUNT(&vote_devp->dev_hdr)) {
+ vote_devp->lock = API_SemaphoreMCreate("vote_lock", LW_PRIO_DEF_CEILING, LW_OPTION_WAIT_PRIORITY |
+ LW_OPTION_INHERIT_PRIORITY | LW_OPTION_DELETE_SAFE |
+ LW_OPTION_OBJECT_GLOBAL, LW_NULL);
+ if ( LW_OBJECT_HANDLE_INVALID == vote_devp->lock) {
+ printk(KERN_ERR "vote_open(): failed to create lock\r\n");
+
+ LW_DEV_DEC_USE_COUNT(&(vote_devp->dev_hdr));
+ API_IosFdNodeDec(&(vote_devp->fdnode_header), pfdnode, NULL);
+
+ return (PX_ERROR);
+ }
+
+ return ((LONG)pfdnode);
+ }
+
+ return ((long)pfdnode);
+ }
+}
+
+/*********************************************************************************************************
+** 函数名称: vote_close
+** 功能描述: 关闭 VOTE 设备
+** 输 入 : pFdEntry 文件结构
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static int vote_close(PLW_FD_ENTRY pfdentry)
+{
+ vote_dev_t *vote_devp = container_of(pfdentry->FDENTRY_pdevhdrHdr, vote_dev_t, dev_hdr);
+ PLW_FD_NODE pfdnode = (PLW_FD_NODE)(pfdentry->FDENTRY_pfdnode);
+
+ if ( pfdentry && pfdnode) {
+ if ( 0 == LW_DEV_DEC_USE_COUNT(&(vote_devp->dev_hdr))) {
+ API_SemaphoreMDelete(&vote_devp->lock);
+ API_IosFdNodeDec(&(vote_devp->fdnode_header), pfdnode, NULL);
+ }
+
+ return (ERROR_NONE);
+ }
+
+ return (PX_ERROR);
+}
+
+/*********************************************************************************************************
+** 函数名称: vote_ioctl
+** 功能描述: 控制 VOTE 设备
+** 输 入 : pfdentry 文件结构
+** cmd 命令
+** arg 参数
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static int vote_ioctl(PLW_FD_ENTRY pfdentry, int cmd, long arg)
+{
+ unsigned int status;
+ vote_dev_t *vote_devp = (vote_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+ addr_t base_addr = vote_devp->phy_addr_base;
+ unsigned int retry = 0;
+
+ switch (cmd) {
+
+ case VOTESWITCH: /* 切权 */
+ API_SemaphoreMPend(vote_devp->lock, LW_OPTION_WAIT_INFINITE);
+
+ while ( retry < VOTE_TIMES) {
+ status = read32(SAST804_STAT_BASE);
+ if ( (status >> VOTE_STAT) & HAS_VOTE) {
+ status = read32(SAST804_STAT_BASE);
+ if ( (status >> VOTE_STAT) & HAS_VOTE) {
+
+ API_SemaphoreMPost(vote_devp->lock);
+ return (ERROR_NONE);
+ }
+ }
+
+ write32(SVOTE_CMD, base_addr);
+ ++retry;
+
+ usleep(100);
+ }
+ API_SemaphoreMPost(vote_devp->lock);
+ return (PX_ERROR);
+
+ default:
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: vote_write
+** 功能描述: 驱动 write 函数
+** 输 入 : pfdentry
+** bufp 写缓冲
+** len 写数据长度
+** 输 出 : 成功写入数据字节数量
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static ssize_t vote_write(PLW_FD_ENTRY pfdentry, void *bufp, size_t len)
+{
+
+ return (len);
+}
+
+/*********************************************************************************************************
+** 函数名称: vote_read
+** 功能描述: 驱动 read 函数
+** 输 入 :
+** 输 出 : 成功读取数据字节数量
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static ssize_t vote_read(PLW_FD_ENTRY pfdentry, void *bufp, size_t len)
+{
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: vote_drv
+** 功能描述: 安装 VOTE 驱动
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+int vote_drv(void)
+{
+ struct file_operations filops;
+
+ if ( vote_drv_num) {
+
+ return (ERROR_NONE);
+ }
+
+ lib_memset(&filops, 0, sizeof(struct file_operations));
+
+ filops.owner = THIS_MODULE;
+ filops.fo_create = vote_open;
+ filops.fo_open = vote_open;
+ filops.fo_close = vote_close;
+ filops.fo_ioctl = vote_ioctl;
+ filops.fo_write = vote_write;
+ filops.fo_read = vote_read;
+
+ vote_drv_num = iosDrvInstallEx2(&filops, LW_DRV_TYPE_NEW_1);
+
+ DRIVER_LICENSE(vote_drv_num, "Dual BSD/GPL->Ver 1.0");
+ DRIVER_AUTHOR(vote_drv_num, "Gavin.Bai");
+ DRIVER_DESCRIPTION(vote_drv_num, "VOTE driver.");
+
+ return (vote_drv_num > 0) ? (ERROR_NONE) : (PX_ERROR);
+}
+
+/*********************************************************************************************************
+** 函数名称: vote_devadd
+** 功能描述: 创建 VOTE 设备
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+int vote_devadd(void)
+{
+ vote_dev_t *vote_devp;
+
+ vote_devp = &sast804_vote_dev;
+
+ vote_devp->phy_addr_base = SAST804_VOTE_BASE;
+ vote_devp->phy_addr_size = LW_CFG_VMM_PAGE_SIZE;
+ vote_devp->virt_addr_base = SAST804_VOTE_BASE;
+
+ if ( ERROR_NONE != API_IosDevAddEx(&vote_devp->dev_hdr, SAST804_VOTE_DEV, vote_drv_num, DT_CHR)) {
+ printk(KERN_ERR "vote_devadd(): can not add VOTE device : %s.\n", strerror(errno));
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: module_init
+** 功能描述: 内核模块加载函数
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+int module_init(void)
+{
+ if ( vote_drv()) {
+ printk(KERN_ERR "module_init(): can not add VOTE device driver : %s.\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ if ( vote_devadd()) {
+ printk(KERN_ERR "module_init(): can not add VOTE device: %s\r\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: module_exit
+** 功能描述: 内核模块卸载函数
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+void module_exit(void)
+{
+ iosDevFileAbnormal(&(sast804_vote_dev.dev_hdr));
+
+ iosDevDelete(&(sast804_vote_dev.dev_hdr));
+
+ iosDrvRemove(vote_drv_num, TRUE);
+}
diff --git a/SylixOS/kmodule/mpc750_vote/mpc750_vote_com.h b/SylixOS/kmodule/mpc750_vote/mpc750_vote_com.h
new file mode 100644
index 0000000..d0af942
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_vote/mpc750_vote_com.h
@@ -0,0 +1,29 @@
+/*********************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM)
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: mpc750_rtc_com.h
+**
+** 创 建 人: Gavin.Bai ()
+**
+** 文件创建日期: 2018 年 09 月 19 日
+**
+** 描 述: VOTE指令驱动
+*********************************************************************************************************/
+
+#ifndef SRC_MPC750_VOTE_COM_H_
+#define SRC_MPC750_VOTE_COM_H_
+
+#include <sys/ioccom.h>
+
+#define VOTESWITCH _IOR('x', 153, int)
+
+#endif /* SRC_MPC750_VOTE_COM_H_ */
diff --git a/SylixOS/kmodule/mpc750_wdg/mpc750_wdg.c b/SylixOS/kmodule/mpc750_wdg/mpc750_wdg.c
new file mode 100644
index 0000000..1284747
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_wdg/mpc750_wdg.c
@@ -0,0 +1,352 @@
+/*********************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM) LW : long wing
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: mpc750_wdg.c
+**
+** 创 建 人: Gavin.Bai (白亮)
+**
+** 文件创建日期: 2018 年 09 月 18 日
+**
+** 描 述: 看门狗定时器驱动,看门狗的使用流程为:
+** int fd;
+** unsigned int weigou = 0x55AA;
+** fd = open("/dev/wdt", O_RDWR, 0666);
+** ioctl(fd, WDTFEED, weigou);
+** sleep(5);
+** ioctl(fd, WDTFEED, weigou);
+** sleep(5);
+** close(fd);
+*********************************************************************************************************/
+
+#define __SYLIXOS_KERNEL
+#include <SylixOS.h>
+#include <module.h>
+#include <string.h>
+
+#include "mpc750_wdg_com.h"
+
+/*********************************************************************************************************
+ WATCH_DOG 寄存器定义,寄存器为32位,但是只有低16位有效,
+*********************************************************************************************************/
+#define WBARKCNT (0x0) /* 获取当前看门狗复位次数,低8位有效 */
+#define WCOUNTER (0x4)
+#define WFEED (0x8) /* 喂狗寄存器,写入0x55AA,高16位可为任意值 */
+#define WCLR (0xC) /* 咬狗次数清零寄存器,写入0x55AA,忽略高16位 */
+#define WEN (0x1<<13) /* 看门狗是否使能 */
+
+#define WDT_NUM (1)
+
+#define WFEED_CMD (0x55AA) /* 喂狗值 */
+#define WCLR_CMD (0x55AA) /* 清除咬狗次数 */
+#define START_CMD (0xAA55)
+
+/*********************************************************************************************************
+ 看门狗相关定义
+*********************************************************************************************************/
+#define SAST804_WDT_BASE (0x30000070)
+#define SAST804_WDT_DEV ("/dev/wdt")
+#define SAST804_SYS_BASE (0x30000000)
+
+/*********************************************************************************************************
+ wdg 控制器类型定义
+*********************************************************************************************************/
+typedef struct {
+ LW_DEV_HDR dev_hdr;
+ LW_LIST_LINE_HEADER fdnode_header;
+ addr_t phy_addr_base;
+ addr_t phy_addr_size;
+ addr_t virt_addr_base;
+
+ LW_HANDLE lock;
+} wdg_dev_t;
+
+static unsigned int wdg_drv_num = 0;
+static wdg_dev_t sast804_wdg_dev;
+uint32_t _version_nm = 0x20010100;
+
+/*********************************************************************************************************
+** 函数名称: wdg_open
+** 功能描述: 打开 WATCH_DOG 设备
+** 输 入 : wdg_degp 设备
+** namep 设备名字
+** flags 标志
+** mode 模式
+** 输 出 : 文件节点
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static long wdg_open (wdg_dev_t *wdg_devp, char *namep, int flags, int mode)
+{
+ PLW_FD_NODE pfdnode;
+ BOOL is_new;
+ addr_t base_addr;
+
+ if ( LW_NULL == namep) {
+ errno = ERROR_IO_NO_DEVICE_NAME_IN_PATH;
+ _ErrorHandle(ERROR_IO_NO_DEVICE_NAME_IN_PATH);
+
+ return (PX_ERROR);
+ } else {
+ pfdnode = API_IosFdNodeAdd(&wdg_devp->fdnode_header, (dev_t) wdg_devp,
+ 0, flags, mode, 0, 0, 0, LW_NULL, &is_new);
+ if ( LW_NULL == pfdnode) {
+ printk(KERN_ERR "wdg_open(): failed to add fd node!\n");
+
+ return (PX_ERROR);
+ } else {
+ if ( 1 == LW_DEV_INC_USE_COUNT(&wdg_devp->dev_hdr)) {
+ /*
+ * 添加设备初始化和使能操作,看门狗默认复位时间为6s
+ */
+ base_addr = wdg_devp->phy_addr_base;
+ write32(WFEED_CMD, base_addr + WFEED);
+
+ wdg_devp->lock = API_SemaphoreBCreate("wdg_lock", LW_TRUE,
+ LW_OPTION_WAIT_FIFO, LW_NULL);
+ if (LW_OBJECT_HANDLE_INVALID == wdg_devp->lock) {
+ printk(KERN_ERR "wdg_open(): failed to create lock\r\n");
+
+ LW_DEV_DEC_USE_COUNT(&(wdg_devp->dev_hdr));
+ API_IosFdNodeDec(&(wdg_devp->fdnode_header), pfdnode, NULL);
+ }
+
+ return ((long) pfdnode);
+ }
+ }
+
+ return ((long)pfdnode);
+ }
+}
+
+/*********************************************************************************************************
+** 函数名称: wdg_close
+** 功能描述: 关闭 WATCH_DOG 设备
+** 输 入 : pfdentry 文件结构
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static int wdg_close(PLW_FD_ENTRY pfdentry)
+{
+ /*
+ * 看门狗一旦被使能,就不能够禁止,
+ */
+ PLW_FD_NODE pfdnode = (PLW_FD_NODE)pfdentry->FDENTRY_pfdnode;
+ wdg_dev_t * wdg_devp = (wdg_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+
+ if ( pfdentry && pfdnode) {
+ if ( 0x0 == LW_DEV_DEC_USE_COUNT(&(wdg_devp->dev_hdr))) {
+ API_SemaphoreBDelete(&wdg_devp->lock);
+ API_IosFdNodeDec(&(wdg_devp->fdnode_header), pfdnode, NULL);
+ }
+
+ return (ERROR_NONE);
+ } else {
+ return (PX_ERROR);
+ }
+}
+
+/********************************************************************************************************
+** 函数名称: wdg_ioctl
+** 功能描述: 控制 WATCH_DOG 设备
+** 输 入 : pfdentry 文件结构
+** cmd 命令
+** arg 参数
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static int wdg_ioctl (PLW_FD_ENTRY pfdentry, int cmd, long arg)
+{
+ wdg_dev_t *wdg_devp = (wdg_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+ addr_t base_addr = wdg_devp->phy_addr_base;
+
+ switch (cmd) {
+
+ case WDTCLEAR: /* 清除看门狗咬狗次数 */
+ API_SemaphoreBPend(wdg_devp->lock, LW_OPTION_WAIT_INFINITE);
+ write32(WCLR_CMD, base_addr + WCLR);
+ API_SemaphoreBPost(wdg_devp->lock);
+
+ break;
+
+ case WDTFEED: /* 喂狗 */
+ API_SemaphoreBPend(wdg_devp->lock, LW_OPTION_WAIT_INFINITE);
+ write32(WFEED_CMD, base_addr + WFEED);
+ API_SemaphoreBPost(wdg_devp->lock);
+
+ break;
+
+ case WDTCOUNTER:
+ API_SemaphoreBPend(wdg_devp->lock, LW_OPTION_WAIT_INFINITE);
+ *(uint32_t *)arg = read32(base_addr + WCOUNTER);
+ API_SemaphoreBPost(wdg_devp->lock);
+ break;
+
+ default:
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/********************************************************************************************************
+** 函数名称: wdg_write
+** 功能描述: 驱动 write 函数,实现看门狗喂狗功能,写入字符为0x55AA
+** 输 入 : pfdentry
+** bufp 写缓冲
+** len 写数据长度
+** 输 出 : 成功写入数据字节数量
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static ssize_t wdg_write(PLW_FD_ENTRY pfdentry, void *bufp, size_t len)
+{
+
+ return (len);
+}
+
+/*********************************************************************************************************
+** 函数名称: wdg_read
+** 功能描述: 驱动 read 函数
+** 输 入 :
+** 输 出 : 成功读取数据字节数量
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static ssize_t wdg_read(PLW_FD_ENTRY pfdentry, void *bufp, size_t len)
+{
+ wdg_dev_t *wdg_devp = (wdg_dev_t *)pfdentry->FDENTRY_pdevhdrHdr;
+ addr_t base_addr = wdg_devp->phy_addr_base;
+
+ /*
+ * 返回看门狗状态,4:上电复位,1:看门狗复位,0:软件复位
+ */
+ API_SemaphoreBPend(wdg_devp->lock, LW_OPTION_WAIT_INFINITE);
+ *(int *)bufp = read32(base_addr + WBARKCNT);
+ API_SemaphoreBPost(wdg_devp->lock);
+
+ return (4);
+}
+
+/*********************************************************************************************************
+** 函数名称: sast804WatchDogDrv
+** 功能描述: 安装 WATCH_DOG 驱动
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+int wdg_drv(void)
+{
+ struct file_operations filops;
+
+ if ( wdg_drv_num) {
+
+ return (ERROR_NONE);
+ }
+
+ lib_memset(&filops, 0, sizeof(struct file_operations));
+
+ filops.owner = THIS_MODULE;
+ filops.fo_create = wdg_open;
+ filops.fo_open = wdg_open;
+ filops.fo_close = wdg_close;
+ filops.fo_ioctl = wdg_ioctl;
+ filops.fo_write = wdg_write;
+ filops.fo_read = wdg_read;
+
+ wdg_drv_num = iosDrvInstallEx2(&filops, LW_DRV_TYPE_NEW_1);
+
+ DRIVER_LICENSE(wdg_drv_num, "Dual BSD/GPL->Ver 1.0");
+ DRIVER_AUTHOR(wdg_drv_num, "Gavin.Bai");
+ DRIVER_DESCRIPTION(wdg_drv_num, "WDT driver.");
+
+ return (wdg_drv_num > 0) ? (ERROR_NONE) : (PX_ERROR);
+}
+
+/*********************************************************************************************************
+** 函数名称: wdg_devadd
+** 功能描述: 创建 WATCH_DOG 设备
+** 输 入 : index ID
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+int wdg_devadd(unsigned int index)
+{
+ wdg_dev_t *wdg_devp;
+
+ if ( index >= WDT_NUM) {
+ printk(KERN_ERR "wdg_devadd(): wdg index invalid!\n");
+
+ return (PX_ERROR);
+ }
+
+ wdg_devp = &sast804_wdg_dev;
+
+ if ( 0 == index) {
+ wdg_devp->phy_addr_base = SAST804_WDT_BASE;
+ wdg_devp->phy_addr_size = LW_CFG_VMM_PAGE_SIZE;
+ wdg_devp->virt_addr_base = SAST804_WDT_BASE;
+ }
+
+ if ( ERROR_NONE != API_IosDevAddEx(&wdg_devp->dev_hdr, SAST804_WDT_DEV, wdg_drv_num, DT_CHR)) {
+ printk(KERN_ERR "wdg_devadd(): can not add device : %s.\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: module_init
+** 功能描述: wdg内核模块加载
+** 输 入 : NONE
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+int module_init(void)
+{
+ if ( wdg_drv()) {
+ printk(KERN_ERR "module_init(): can not add WDG device driver : %s.\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ if ( wdg_devadd(0)) {
+ printk(KERN_ERR "module_init(): can not add WDG device : %s.\n", strerror(errno));
+
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+
+/*********************************************************************************************************
+** 函数名称: module_exit
+** 功能描述: wdg内核模块卸载
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+void module_exit(void)
+{
+ iosDevFileAbnormal(&(sast804_wdg_dev.dev_hdr));
+
+ iosDevDelete(&(sast804_wdg_dev.dev_hdr));
+
+ iosDrvRemove(wdg_drv_num, TRUE);
+}
diff --git a/SylixOS/kmodule/mpc750_wdg/mpc750_wdg_com.h b/SylixOS/kmodule/mpc750_wdg/mpc750_wdg_com.h
new file mode 100644
index 0000000..809ab32
--- /dev/null
+++ b/SylixOS/kmodule/mpc750_wdg/mpc750_wdg_com.h
@@ -0,0 +1,31 @@
+/*********************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM)
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: mpc750_rtc_com.h
+**
+** 创 建 人: Gavin.Bai ()
+**
+** 文件创建日期: 2018 年 09 月 19 日
+**
+** 描 述: WDG指令驱动
+*********************************************************************************************************/
+
+#ifndef SRC_MPC750_WDG_COM_H_
+#define SRC_MPC750_WDG_COM_H_
+
+#include <sys/ioccom.h>
+
+#define WDTCLEAR _IOW('x', 180, int)
+#define WDTFEED _IOW('x', 181, int)
+#define WDTCOUNTER _IOW('x', 182, int)
+
+#endif /* SRC_MPC750_WDG_COM_H_ */
diff --git a/out.map b/out.map
new file mode 100644
index 0000000..eaa2fbc
--- /dev/null
+++ b/out.map
@@ -0,0 +1,563 @@
+
+Allocating common symbols
+Common symbol size file
+
+crespond_hdr 0x22 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_serv.o
+welcome_hdr 0x20 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_serv.o
+err_hdr 0x1c ./Release/obj/kidvpn/SylixOS/kidvpn/kv_serv.o
+hpquery_hdr 0x1c ./Release/obj/kidvpn/SylixOS/kidvpn/kv_client.o
+hprespond_hdr 0x1c ./Release/obj/kidvpn/SylixOS/kidvpn/kv_client.o
+cquery_hdr 0x1c ./Release/obj/kidvpn/SylixOS/kidvpn/kv_client.o
+
+Discarded input sections
+
+ .group 0x00000000 0x8 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtbegin.o
+ .group 0x00000000 0x8 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtbegin.o
+ .group 0x00000000 0x8 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtend.o
+ .group 0x00000000 0x8 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtend.o
+ .debug_macro 0x00000000 0x6b2 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtend.o
+ .debug_macro 0x00000000 0x10 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtend.o
+
+Memory Configuration
+
+Name Origin Length Attributes
+*default* 0x00000000 0xffffffff
+
+Linker script and memory map
+
+LOAD c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+LOAD c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtbegin.o
+LOAD ./Release/obj/kidvpn/SylixOS/kidvpn/kv_cfg.o
+LOAD ./Release/obj/kidvpn/SylixOS/kidvpn/kv_client.o
+LOAD ./Release/obj/kidvpn/SylixOS/kidvpn/kv_lib.o
+LOAD ./Release/obj/kidvpn/SylixOS/kidvpn/kv_serv.o
+LOAD ./Release/obj/kidvpn/SylixOS/kidvpn/kv_main.o
+LOAD ../libsylixos/Release/libmbedcrypto.so
+LOAD ../libsylixos/Release/libvpmpdm.so
+LOAD c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/../../../../ppc-sylixos-eabi/lib/pic\libm.a
+LOAD c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic\libgcc.a
+LOAD c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic\libgcc.a
+LOAD c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/../../../../ppc-sylixos-eabi/lib/pic\libc.a
+LOAD c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic\libgcc.a
+LOAD c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtend.o
+LOAD c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrtn.o
+ 0x00000000 PROVIDE (__stack, 0x0)
+ 0x00000000 PROVIDE (___stack, 0x0)
+ 0x00000094 . = (0x0 + SIZEOF_HEADERS)
+
+.note.gnu.build-id
+ *(.note.gnu.build-id)
+
+.hash 0x00000094 0x34c
+ *(.hash)
+ .hash 0x00000094 0x34c c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+
+.gnu.hash
+ *(.gnu.hash)
+
+.dynsym 0x000003e0 0x700
+ *(.dynsym)
+ .dynsym 0x000003e0 0x700 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+
+.dynstr 0x00000ae0 0x4fc
+ *(.dynstr)
+ .dynstr 0x00000ae0 0x4fc c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+
+.gnu.version 0x00000fdc 0x0
+ *(.gnu.version)
+ .gnu.version 0x00000000 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+
+.gnu.version_d 0x00000fdc 0x0
+ *(.gnu.version_d)
+ .gnu.version_d
+ 0x00000000 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+
+.gnu.version_r 0x00000fdc 0x0
+ *(.gnu.version_r)
+ .gnu.version_r
+ 0x00000000 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+
+.rela.dyn 0x00000fdc 0x48c
+ *(.rela.init)
+ *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
+ *(.rela.fini)
+ *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
+ *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
+ .rela.data.rel.local
+ 0x00000fdc 0xc c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
+ *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
+ *(.rela.ctors)
+ *(.rela.dtors)
+ *(.rela.got)
+ .rela.got 0x00000000 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ *(.rela.got1)
+ *(.rela.got2)
+ .rela.got2 0x00000fe8 0x474 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*)
+ *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*)
+ *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*)
+ *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*)
+ *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
+ *(.rela.iplt)
+ .rela.iplt 0x00000000 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ .rela.fixup 0x0000145c 0xc c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+
+.rela.plt 0x00001468 0x30c
+ *(.rela.plt)
+ .rela.plt 0x00001468 0x30c c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+
+.init 0x00001774 0x1c
+ *(SORT(.init))
+ .init 0x00001774 0xc c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ 0x00001774 __init
+ .init 0x00001780 0x10 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrtn.o
+
+.text 0x00001790 0x2c50
+ *(.text.unlikely .text.*_unlikely .text.unlikely.*)
+ *(.text.exit .text.exit.*)
+ *(.text.startup .text.startup.*)
+ .text.startup 0x00001790 0x738 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_main.o
+ 0x00001794 main
+ *(.text.hot .text.hot.*)
+ *(.text .stub .text.* .gnu.linkonce.t.*)
+ .text 0x00001ec8 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ .text 0x00001ec8 0x2a4 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtbegin.o
+ 0x0000200c _init
+ 0x000020ac _fini
+ .text 0x0000216c 0x65c ./Release/obj/kidvpn/SylixOS/kidvpn/kv_cfg.o
+ 0x00002554 kv_cfg_load
+ 0x000025f8 kv_cfg_unload
+ 0x00002668 kv_cfg_getint
+ 0x0000272c kv_cfg_getstring
+ .text 0x000027c8 0xfcc ./Release/obj/kidvpn/SylixOS/kidvpn/kv_client.o
+ 0x0000345c kv_cli_start
+ .text 0x00003794 0x0 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_lib.o
+ .text 0x00003794 0xbd8 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_serv.o
+ 0x000040d4 kv_serv_start
+ .text 0x0000436c 0x0 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_main.o
+ .text 0x0000436c 0x74 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtend.o
+ 0x00004370 __CtorEndDummy
+ .text 0x000043e0 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrtn.o
+ *(.gnu.warning)
+ *(.glink)
+ .glink 0x00000000 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+
+.fini 0x000043e0 0x1c
+ *(SORT(.fini))
+ .fini 0x000043e0 0xc c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ 0x000043e0 __fini
+ .fini 0x000043ec 0x10 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrtn.o
+ 0x000043fc PROVIDE (__etext, .)
+ 0x000043fc PROVIDE (_etext, .)
+ 0x000043fc PROVIDE (etext, .)
+
+.rodata 0x000043fc 0xd30
+ *(.rodata .rodata.* .gnu.linkonce.r.*)
+ .rodata 0x000043fc 0xb c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtbegin.o
+ *fill* 0x00004407 0x1
+ .rodata.str1.4
+ 0x00004408 0x54 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_cfg.o
+ .rodata.str1.4
+ 0x0000445c 0x302 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_client.o
+ *fill* 0x0000475e 0x2
+ .rodata.str1.4
+ 0x00004760 0x15a ./Release/obj/kidvpn/SylixOS/kidvpn/kv_serv.o
+ 0x286 (size before relaxing)
+ *fill* 0x000048ba 0x2
+ .rodata.str1.4
+ 0x000048bc 0x870 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_main.o
+ 0x872 (size before relaxing)
+
+.rodata1
+ *(.rodata1)
+
+.eh_frame_hdr 0x0000512c 0x0
+ *(.eh_frame_hdr)
+ .eh_frame_hdr 0x00000000 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrtn.o
+
+.eh_frame
+ *(.eh_frame)
+
+.gcc_except_table
+ *(.gcc_except_table .gcc_except_table.*)
+
+.exception_ranges
+ *(.exception_ranges .exception_ranges*)
+ 0x0000512c . = (ALIGN (0x10000) - ((0x10000 - .) & 0xffff))
+ 0x0001512c . = DATA_SEGMENT_ALIGN (0x10000, 0x1000)
+
+.eh_frame 0x0001512c 0x8
+ *(.eh_frame)
+ .eh_frame 0x0001512c 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ 0x0001512c __EH_FRAME_BEGIN__
+ .eh_frame 0x00000000 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ .eh_frame 0x0001512c 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtbegin.o
+ .eh_frame 0x0001512c 0x4 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtend.o
+ .eh_frame 0x00015130 0x4 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrtn.o
+ 0x00015130 __EH_FRAME_END__
+
+.gcc_except_table
+ 0x00015134 0x0
+ *(.gcc_except_table .gcc_except_table.*)
+ .gcc_except_table
+ 0x00015134 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ .gcc_except_table
+ 0x00015134 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrtn.o
+
+.exception_ranges
+ *(.exception_ranges .exception_ranges*)
+
+.tdata
+ *(.tdata .tdata.* .gnu.linkonce.td.*)
+
+.tbss
+ *(.tbss .tbss.* .gnu.linkonce.tb.*)
+ *(.tcommon)
+
+.preinit_array
+ *(.preinit_array)
+
+.init_array
+ *(SORT(.init_array.*))
+ *(.init_array)
+
+.fini_array
+ *(SORT(.fini_array.*))
+ *(.fini_array)
+
+.ctors 0x00015134 0x8
+ *crtbegin.o(.ctors)
+ .ctors 0x00015134 0x4 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtbegin.o
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ .ctors 0x00015138 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ 0x00015138 __CTOR_LIST__
+ .ctors 0x00015138 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrtn.o
+ 0x00015138 __CTOR_END__
+ *(SORT(.ctors.*))
+ *(.ctors)
+ .ctors 0x00015138 0x4 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtend.o
+
+.dtors 0x0001513c 0x8
+ *crtbegin.o(.dtors)
+ .dtors 0x0001513c 0x4 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtbegin.o
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ .dtors 0x00015140 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ 0x00015140 __DTOR_LIST__
+ .dtors 0x00015140 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrtn.o
+ 0x00015140 __DTOR_END__
+ *(SORT(.dtors.*))
+ *(.dtors)
+ .dtors 0x00015140 0x4 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtend.o
+
+.jcr 0x00015144 0x4
+ *(.jcr)
+ .jcr 0x00015144 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtbegin.o
+ .jcr 0x00015144 0x4 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtend.o
+
+.data.rel.ro
+ *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*)
+ *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*)
+
+.fixup 0x00015148 0x4
+ *(.fixup)
+ .fixup 0x00015148 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ 0x00015148 __FIXUP_START__
+ .fixup 0x00015148 0x4 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtbegin.o
+ .fixup 0x0001514c 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrtn.o
+ 0x0001514c __FIXUP_END__
+
+.got1 0x0001514c 0x0
+ *(.got1)
+ .got1 0x0001514c 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ .got1 0x0001514c 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrtn.o
+
+.got2 0x0001514c 0x17c
+ *(.got2)
+ .got2 0x0001514c 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ 0x0001514c __GOT2_START__
+ .got2 0x0001514c 0x28 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtbegin.o
+ .got2 0x00015174 0x10 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_cfg.o
+ .got2 0x00015184 0x6c ./Release/obj/kidvpn/SylixOS/kidvpn/kv_client.o
+ .got2 0x000151f0 0x0 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_lib.o
+ .got2 0x000151f0 0x5c ./Release/obj/kidvpn/SylixOS/kidvpn/kv_serv.o
+ .got2 0x0001524c 0x70 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_main.o
+ .got2 0x000152bc 0xc c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtend.o
+ .got2 0x000152c8 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrtn.o
+ 0x000152c8 __GOT2_END__
+
+.dynamic 0x000152c8 0xb0
+ *(.dynamic)
+ .dynamic 0x000152c8 0xb0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ 0x000152c8 _DYNAMIC
+
+.got
+ *(.got)
+ 0x00015378 . = DATA_SEGMENT_RELRO_END (., 0x0)
+
+.plt
+ *(.plt)
+
+.data 0x00015378 0x53
+ *(.data .data.* .gnu.linkonce.d.*)
+ .data 0x00015378 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ .data 0x00015378 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtbegin.o
+ .data.rel.local
+ 0x00015378 0x4 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtbegin.o
+ 0x00015378 G_cpcCompileFpuType
+ .data 0x0001537c 0x7 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_cfg.o
+ 0x0001537c __sylixos_version
+ *fill* 0x00015383 0x1
+ .data 0x00015384 0x1b ./Release/obj/kidvpn/SylixOS/kidvpn/kv_client.o
+ *fill* 0x0001539f 0x1
+ .data 0x000153a0 0x7 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_lib.o
+ *fill* 0x000153a7 0x1
+ .data 0x000153a8 0x1b ./Release/obj/kidvpn/SylixOS/kidvpn/kv_serv.o
+ *fill* 0x000153c3 0x1
+ .data 0x000153c4 0x7 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_main.o
+ .data 0x000153cb 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtend.o
+ .data 0x000153cb 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrtn.o
+
+.data1
+ *(.data1)
+
+.got 0x000153cc 0x10
+ *(.got)
+ .got 0x000153cc 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ 0x000153cc __GOT_START__
+ .got 0x000153cc 0x10 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ 0x000153d0 _GLOBAL_OFFSET_TABLE_
+ .got 0x000153dc 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrtn.o
+ 0x000153dc __GOT_END__
+
+.sdata 0x000153dc 0x0
+ *(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
+ .sdata2 0x000153dc 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ .sdata2 0x000153dc 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrtn.o
+ *(.sdata .sdata.* .gnu.linkonce.s.*)
+ .sdata 0x000153dc 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ .sdata 0x000153dc 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrtn.o
+ 0x000153dc _edata = .
+ 0x000153dc PROVIDE (edata, .)
+ 0x000153dc . = .
+ 0x000153dc __bss_start = .
+
+.sbss 0x000153dc 0x0
+ *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*)
+ .sbss2 0x000153dc 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ .sbss2 0x000153dc 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrtn.o
+ *(.dynsbss)
+ .dynsbss 0x00000000 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ *(.sbss .sbss.* .gnu.linkonce.sb.*)
+ .sbss 0x000153dc 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ .sbss 0x000153dc 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrtn.o
+ *(.scommon)
+
+.plt 0x000153dc 0x354
+ *(.plt)
+ .plt 0x000153dc 0x354 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+
+.iplt 0x00015730 0x0
+ *(.iplt)
+ .iplt 0x00000000 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+
+.bss 0x00015730 0xdf0
+ *(.dynbss)
+ .dynbss 0x00000000 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ *(.bss .bss.* .gnu.linkonce.b.*)
+ .bss 0x00015730 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrti.o
+ .bss 0x00015730 0x81 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtbegin.o
+ .bss 0x000157b1 0x0 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_cfg.o
+ *fill* 0x000157b1 0x3
+ .bss 0x000157b4 0x670 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_client.o
+ .bss 0x00015e24 0x0 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_lib.o
+ .bss 0x00015e24 0x648 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_serv.o
+ .bss 0x0001646c 0x0 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_main.o
+ .bss 0x0001646c 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtend.o
+ .bss 0x0001646c 0x0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/ecrtn.o
+ *(COMMON)
+ COMMON 0x0001646c 0x54 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_client.o
+ 0x0001646c hpquery_hdr
+ 0x00016488 hprespond_hdr
+ 0x000164a4 cquery_hdr
+ COMMON 0x000164c0 0x60 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_serv.o
+ 0x000164c0 crespond_hdr
+ 0x000164e4 welcome_hdr
+ 0x00016504 err_hdr
+ 0x00016520 . = ALIGN ((. != 0x0)?0x4:0x1)
+ 0x00016520 . = ALIGN (0x4)
+ 0x00016520 . = SEGMENT_START ("ldata-segment", .)
+ 0x00016520 . = ALIGN (0x4)
+ 0x00016520 __end = .
+ 0x00016520 _end = .
+ 0x00016520 PROVIDE (end, .)
+ 0x00016520 . = DATA_SEGMENT_END (.)
+
+.stab
+ *(.stab)
+
+.stabstr
+ *(.stabstr)
+
+.stab.excl
+ *(.stab.excl)
+
+.stab.exclstr
+ *(.stab.exclstr)
+
+.stab.index
+ *(.stab.index)
+
+.stab.indexstr
+ *(.stab.indexstr)
+
+.comment 0x00000000 0x80
+ *(.comment)
+ .comment 0x00000000 0x80 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtbegin.o
+ 0x81 (size before relaxing)
+ .comment 0x00000000 0x81 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_cfg.o
+ .comment 0x00000000 0x81 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_client.o
+ .comment 0x00000000 0x81 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_lib.o
+ .comment 0x00000000 0x81 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_serv.o
+ .comment 0x00000000 0x81 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_main.o
+ .comment 0x00000000 0x81 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtend.o
+
+.debug
+ *(.debug)
+
+.line
+ *(.line)
+
+.debug_srcinfo
+ *(.debug_srcinfo)
+
+.debug_sfnames
+ *(.debug_sfnames)
+
+.debug_aranges 0x00000000 0xd8
+ *(.debug_aranges)
+ .debug_aranges
+ 0x00000000 0x20 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtbegin.o
+ .debug_aranges
+ 0x00000020 0x20 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_cfg.o
+ .debug_aranges
+ 0x00000040 0x20 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_client.o
+ .debug_aranges
+ 0x00000060 0x18 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_lib.o
+ .debug_aranges
+ 0x00000078 0x20 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_serv.o
+ .debug_aranges
+ 0x00000098 0x20 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_main.o
+ .debug_aranges
+ 0x000000b8 0x20 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtend.o
+
+.debug_pubnames
+ *(.debug_pubnames)
+
+.debug_info 0x00000000 0x5c31
+ *(.debug_info .gnu.linkonce.wi.*)
+ .debug_info 0x00000000 0x221 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtbegin.o
+ .debug_info 0x00000221 0xc98 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_cfg.o
+ .debug_info 0x00000eb9 0x2037 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_client.o
+ .debug_info 0x00002ef0 0xaf ./Release/obj/kidvpn/SylixOS/kidvpn/kv_lib.o
+ .debug_info 0x00002f9f 0x1adf ./Release/obj/kidvpn/SylixOS/kidvpn/kv_serv.o
+ .debug_info 0x00004a7e 0x10a2 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_main.o
+ .debug_info 0x00005b20 0x111 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtend.o
+
+.debug_abbrev 0x00000000 0xd2a
+ *(.debug_abbrev)
+ .debug_abbrev 0x00000000 0x120 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtbegin.o
+ .debug_abbrev 0x00000120 0x303 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_cfg.o
+ .debug_abbrev 0x00000423 0x2af ./Release/obj/kidvpn/SylixOS/kidvpn/kv_client.o
+ .debug_abbrev 0x000006d2 0x56 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_lib.o
+ .debug_abbrev 0x00000728 0x2b9 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_serv.o
+ .debug_abbrev 0x000009e1 0x297 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_main.o
+ .debug_abbrev 0x00000c78 0xb2 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtend.o
+
+.debug_line 0x00000000 0x16ec
+ *(.debug_line .debug_line.* .debug_line_end)
+ .debug_line 0x00000000 0x8b c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtbegin.o
+ .debug_line 0x0000008b 0x368 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_cfg.o
+ .debug_line 0x000003f3 0x79b ./Release/obj/kidvpn/SylixOS/kidvpn/kv_client.o
+ .debug_line 0x00000b8e 0x6b ./Release/obj/kidvpn/SylixOS/kidvpn/kv_lib.o
+ .debug_line 0x00000bf9 0x686 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_serv.o
+ .debug_line 0x0000127f 0x41e ./Release/obj/kidvpn/SylixOS/kidvpn/kv_main.o
+ .debug_line 0x0000169d 0x4f c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtend.o
+
+.debug_frame 0x00000000 0x4d8
+ *(.debug_frame)
+ .debug_frame 0x00000000 0xb0 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtbegin.o
+ .debug_frame 0x000000b0 0x16c ./Release/obj/kidvpn/SylixOS/kidvpn/kv_cfg.o
+ .debug_frame 0x0000021c 0x118 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_client.o
+ .debug_frame 0x00000334 0x100 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_serv.o
+ .debug_frame 0x00000434 0x6c ./Release/obj/kidvpn/SylixOS/kidvpn/kv_main.o
+ .debug_frame 0x000004a0 0x38 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtend.o
+
+.debug_str 0x00000000 0x2ca2
+ *(.debug_str)
+ .debug_str 0x00000000 0x2099 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtbegin.o
+ 0x20b9 (size before relaxing)
+ .debug_str 0x00002099 0x3b6 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_cfg.o
+ 0x49a (size before relaxing)
+ .debug_str 0x0000244f 0x677 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_client.o
+ 0xa42 (size before relaxing)
+ .debug_str 0x00002ac6 0x26 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_lib.o
+ 0x1de (size before relaxing)
+ .debug_str 0x00002aec 0x93 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_serv.o
+ 0x93a (size before relaxing)
+ .debug_str 0x00002b7f 0xcf ./Release/obj/kidvpn/SylixOS/kidvpn/kv_main.o
+ 0x4e1 (size before relaxing)
+ .debug_str 0x00002c4e 0x54 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtend.o
+ 0x2041 (size before relaxing)
+
+.debug_loc 0x00000000 0x23dc
+ *(.debug_loc)
+ .debug_loc 0x00000000 0x110 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtbegin.o
+ .debug_loc 0x00000110 0x764 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_cfg.o
+ .debug_loc 0x00000874 0x932 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_client.o
+ .debug_loc 0x000011a6 0x743 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_serv.o
+ .debug_loc 0x000018e9 0xaaf ./Release/obj/kidvpn/SylixOS/kidvpn/kv_main.o
+ .debug_loc 0x00002398 0x44 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtend.o
+
+.debug_macinfo
+ *(.debug_macinfo)
+
+.debug_weaknames
+ *(.debug_weaknames)
+
+.debug_funcnames
+ *(.debug_funcnames)
+
+.debug_typenames
+ *(.debug_typenames)
+
+.debug_varnames
+ *(.debug_varnames)
+
+.debug_pubtypes
+ *(.debug_pubtypes)
+
+.debug_ranges 0x00000000 0x190
+ *(.debug_ranges)
+ .debug_ranges 0x00000000 0x58 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_cfg.o
+ .debug_ranges 0x00000058 0x90 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_client.o
+ .debug_ranges 0x000000e8 0x70 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_serv.o
+ .debug_ranges 0x00000158 0x38 ./Release/obj/kidvpn/SylixOS/kidvpn/kv_main.o
+
+.debug_macro 0x00000000 0x6f6
+ *(.debug_macro)
+ .debug_macro 0x00000000 0x1a c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtbegin.o
+ .debug_macro 0x0000001a 0x6b2 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtbegin.o
+ .debug_macro 0x000006cc 0x10 c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtbegin.o
+ .debug_macro 0x000006dc 0x1a c:/acoinfo/realevo/compiler/ppc-sylixos-toolchain/bin/../lib/gcc/ppc-sylixos-eabi/4.9.3/pic/crtend.o
+
+.gnu.attributes
+ *(.gnu.attributes)
+
+/DISCARD/
+ *(.note.GNU-stack)
+ *(.gnu_debuglink)
+ *(.gnu.lto_*)
+OUTPUT(Release/kidvpn elf32-powerpc)