huangcm
2025-07-03 a76b2fadf6ad4adf86e241e3753a63efe03ef80c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/**
 * system/message_manager/message_manager.c
 *
 * Descript: message manager module
 * Copyright (C) 2012-2016 AllWinnertech Ltd.
 * Author: Sunny <Sunny@allwinnertech.com>
 *
 */
 
#include "message_manager_i.h"
#include "wakeup_source.h"
 
s32 message_valid(struct message *pmessage)
{
   /* valid message */
   if (!!pmessage->type)
       return TRUE;
 
   /* invalid message */
   return FALSE;
}
 
/**
 * message_manager_init() - initialize message manager.
 *
 * @return: OK if initialize succeeded, others if failed.
 */
s32 message_manager_init(void)
{
   return OK;
}
 
/**
 * message_manager_exit() - exit message manager.
 *
 * @return: OK if exit succeeded, others if failed.
 */
s32 message_manager_exit(void)
{
   return OK;
}
 
/**
 * process_message() - process one message.
 *
 * pmessage: the pointer of message frame which we want to process.
 * @return: OK if process message succeeded, other if failed.
 */
static s32 process_message(struct message *pmessage)
{
   s32 result;
 
   /* process message */
   switch (pmessage->type) {
 
   case CPU_OP_REQ:
       LOG("cpu op req\n");
       result = cpu_op(pmessage);
       break;
 
   case SYS_OP_REQ:
       LOG("sys op req\n");
       result = sys_op(pmessage);
       break;
 
   case CLEAR_WAKEUP_SRC_REQ:
       LOG("clear wakeup src req\n");
       result = clear_wakeup_src(pmessage);
       break;
 
   case SET_WAKEUP_SRC_REQ:
       LOG("set wakeup src req\n");
       result = set_wakeup_src(pmessage);
       break;
 
   case SET_DEBUG_LEVEL_REQ:
       INF("set debug level request\n");
       result = set_debug_level(pmessage->paras[0]);
       break;
 
   case SET_UART_BAUDRATE:
       INF("set uart baudrate request\n");
       result = uart_set_baudrate(pmessage->paras[0]);
       break;
 
   case SET_DRAM_CRC_PARAS:
       INF("set dram crc paras request\n");
       result = standby_set_dram_crc_paras(pmessage->paras[0], pmessage->paras[1], pmessage->paras[2]);
       break;
 
   case MESSAGE_LOOPBACK:
       INF("loopback message request\n");
       result = OK;
       break;
 
   default:
       ERR("imt [%x]\n", pmessage->type);
       hexdump("msg", (char *)pmessage, sizeof(struct message));
       result = -ESRCH;
       break;
   }
 
   pmessage->result = result;
 
   /* synchronous message, should feedback process result */
   if (pmessage->attr & (MESSAGE_ATTR_SOFTSYN | MESSAGE_ATTR_HARDSYN))
       hwmsgbox_feedback_message(pmessage, SEND_MSG_TIMEOUT);
 
   return OK;
}
 
/**
 * message_coming_notify() - notify system that one message coming.
 *
 * pmessage: the pointer of coming message frame.
 * @return: OK if notify succeeded, other if failed.
 */
s32 message_coming_notify(struct message *pmessage)
{
   /*
    * be careful, here we keep cpu interrupt on when processing message,
    * and we should avoid interrupt as far as possible.
    */
 
   /* ar100 receive message from ac327 */
   INF("MESSAGE FROM AC327\n");
   INF("state:%x\n", pmessage->state);
   INF("type:%x\n", pmessage->type);
   INF("attr:%x\n", pmessage->attr);
   INF("count: 0x%x\n", pmessage->count);
 
   if (process_message(pmessage) != OK)
       WRN("message [%x, %x] process fail\n", pmessage, pmessage->type);
 
   return OK;
}