blob: 48e3eaaad70732b55ca153efbc8ac5932d31a6c4 [file] [log] [blame]
xf.libfc6e712025-02-07 01:54:34 -08001#include <linux/module.h>
2#include <linux/errno.h>
3#include <linux/proc_fs.h>
4#include <linux/uaccess.h>
5#include <linux/cdev.h>
6#include <linux/cpnv.h>
7#include <linux/vmalloc.h>
8#include <linux/string.h>
9#include <linux/cp_types.h>
10#include <linux/init.h>
11#include <linux/sched.h>
12#include <linux/kthread.h>
13#include <linux/device.h>
xf.li771eb062025-02-09 23:05:11 -080014
15MODULE_AUTHOR("ZTE");
16MODULE_LICENSE("Proprietary");
17
18extern unsigned int zOss_ResetNVFactory(void);
19extern unsigned int zOss_NvramFlush(void);
20extern unsigned int zOss_NvItemWrite(unsigned int,unsigned char *,unsigned int);
21extern int zDrvNand_Program(unsigned int,unsigned int,unsigned char *);
22extern void zOss_NvItemWriteFactory(unsigned int,unsigned char *,unsigned int);
23extern int zDrvNand_ChangeNvrAttr(unsigned int);
24extern unsigned int zOss_NvItemRead(unsigned int,unsigned char *,unsigned int);
25extern ssize_t zCatAgt_App_Write(const char *, size_t);
26extern ssize_t zCatAgt_Kernel_Write(const char *, size_t);
27extern void linux_oss_tick_timer_function(void);
28extern unsigned int zOss_GetExceptResetFlag(void);
29extern int zSys_ExceptReboot(unsigned int);
30extern int zDrvRpMsg_Write(const void *);
31extern int zDrvRpMsg_CreateChannel(unsigned int, unsigned int, unsigned int size);
32extern int zDrvRpMsg_RegCallBack(unsigned int, unsigned int, void *);
33extern int zAti_CidIsUsed(unsigned char);
34//extern unsigned char *zGetpsbufferHead(unsigned char *);
35extern int zAti2_Send(unsigned char , unsigned char *, unsigned short , unsigned int );
36extern unsigned char zAti_GetDualCardStat(unsigned char *pbSim1Stat, unsigned char *pbSim2Stat, unsigned char *pbIsCardSwitching);
37extern unsigned char *zPutSkb2Psbuf(unsigned char *, unsigned short, unsigned char *, unsigned char *);
38extern unsigned short zGetUpLinkSduSize(void);
39extern int zAti2_Open(unsigned char);
40extern unsigned int zAt_AutoTestInit(void);
41extern int zAti2_IsExCid(unsigned char,unsigned char *);
42extern void zUsat_RegisterSendMsgFun(void *);
43extern int zAti2_RegRecvCb(void *);
44extern void zUsat_SendAtCmd(unsigned int, const unsigned char *, unsigned short, unsigned int);
45extern void AmtAgent_ComposeAndProcess(unsigned char *, unsigned int);
46extern void RegSendDataToAmtAppFunction(void *);
47extern void zDrvLpm_IrqDisable(unsigned int);
48extern void zDrvLpm_IrqEnable(unsigned int);
49extern void zDrvInt_MaskIrq(unsigned int);
50extern void zDrvInt_UnmaskIrq(unsigned int);
51extern int zPs_IsTdMasterMode(void);
52extern int zPs_IsLteMasterMode(void);
53extern int zPs_IsFddMasterMode(void);
54extern void psm_ModemDevSleep(void);
55extern bool psm_ModemSleepCheck(void);
56extern unsigned int psm_ModemSleepTimeGet(void);
57extern void psm_GetModemSleepFlagStatus(void);
58extern void psm_TimeCompensate(unsigned int);
59extern void zFreeDlBuf(unsigned char *);
60extern int zte_modem_start(void);
61extern unsigned long Comm_Read_CP_TO_AP_Data(const char *, unsigned long);
62extern unsigned long Comm_Write_AP_TO_CP_Data(const char *, unsigned long);
63extern int zDrvVoice_Close(void);
64extern int zDrvVoice_ReadStart(void);
65extern int zDrvVoice_ReadStop(void);
66extern int zDrvVoice_WriteStart(void);
67extern int zDrvVoice_WriteStop(void);
68extern int zDrvVoice_Open(void *);
69extern int zDrvVoice_WriteOneFrame(unsigned char *);
70extern int zDrvVoice_ReadOneFrame(unsigned char *);
71extern int halVoice_SetPathIn(void *);
72extern int halVoice_SetPathOut(void *);
73extern int halVoice_SetVolOut(void *);
74extern int halVoice_Enable(void);
75extern int halVoice_Open(void);
76extern int halVoice_Disable(void);
77extern int halVoice_Close(void);
78extern int halVoice_Open3G(void);
79extern int halVoice_Close3G(void);
80extern int zDrv_Audio_Printf(void *, ...);
81extern void zDrvVp_SetDtmfMute_Wrap(void);
82extern int zDrvVp_SetTone_Wrap(int);
83extern int zDrvVp_SetMute_Wrap(int);
84extern int zDrvVp_GetMute_Wrap(void);
85extern int zDrvVp_SetRxMute_Wrap(int );
86extern int zDrvVp_GetRxMute_Wrap(void);
87extern int zDrvVp_SetVol_Wrap(int);
88extern int zDrvVp_GetVol_Wrap(void);
89extern int zDrvVp_GetTxVol_Wrap(void);
90extern int zDrvVp_SetTxVol_Wrap(int);
91extern int zDrvVp_SetVol_Gain_Wrap(int);
92extern int zDrvVp_GetVol_Gain_Wrap(void);
93extern int zDrvVp_SetTxVol_Gain_Wrap(int);
94extern int zDrvVp_GetTxVol_Gain_Wrap(void);
95extern int zDrvVp_GetPath_Wrap(void);
96extern int zDrvVp_Loop(int);
97extern int zDrvVp_Soft_Dtmf_Loop(int);
98extern void zDrvDtmf_Detect_RegCallbacks(T_DrvDtmf_Detect_Opt);
99extern int zDrvVp_SetPath_Wrap(int);
100extern int zDrvVp_GetPath_Wrap(void);
101extern int zDrvVp_GetSlicFlag(void);
102extern int zDrvVp_SetEchoDelay_Wrap(int val);
103extern int zDrvVp_GetEchoDelay_Wrap(void);
104extern int zDrvVp_SetTxNsMode_Wrap(int val);
105extern int zDrvVp_GetTxNsMode_Wrap(void);
106extern int zDrvVp_SetRxNsMode_Wrap(int val);
107extern int zDrvVp_GetRxNsMode_Wrap(void);
108extern int zDrvVp_SetModuleState_Wrap(int *,int);
109extern int zDrvVp_GetModuleState_Wrap(int *,int);
110extern VOID* mmp_AmrDecOpen (T_zMmp_CodecType codecType);
111extern VOID* mmp_AmrEncOpen (T_zMmp_CodecType codecType, BOOL isDtxEnable);
112extern UINT16 mmp_AmrDecode (VOID *pCodecContext, const UINT8 *pAmr, UINT16 *pPcm);
113extern UINT16 mmp_AmrEncode (VOID *pCodecContext, T_zMmp_AmrEncMode mode, const UINT16 *pPcm, UINT8 *pAmr);
114extern VOID mmp_AmrDecClose (VOID *pCodecContext);
115extern VOID mmp_AmrEncClose (VOID *pCodecContext);
116extern UINT8 zDrvEdcp_IsBusy(int EdcpNum);
117extern SINT32 zDrvVp_AudioDataWrite(const VOID *pBuf, UINT32 uiLen);
118extern SINT32 zDrvVp_AudioDataOpen(UINT32 audioType, UINT32 sampleRate);
119extern SINT32 zDrvVp_AudioDataClose(void);
120extern SINT32 zDrvVp_GetVpLoop_Wrap(VOID);
121extern VOID zDrvVp_Status(UINT32 *sample_rate, UINT32 *voice_status);
122extern VOID zDrvVp_UpdateVoiceNv(UINT8 *voice_nv_update);
123extern int zDrvVp_SetVoiceProc_Wrap(int val);
124extern int zDrvVp_GetVoiceProc_Wrap(void);
125extern int zDrvVp_SetVoiceBuffer_Wrap(int en,int type);
126extern void zDrvVp_GetVoiceBuffer_Wrap(int *en,int *type);
127
128
129
130
131typedef struct cpko_section {
132 unsigned int cpko_text_start;
133 unsigned int cpko_rodata_start;
134 unsigned int __utran_modem_text_start;
135 unsigned int __lte_modem_text_start;
136 unsigned int __comm_modem_text_start;
137 unsigned int modem_text_end;
138 unsigned int cpko_data_start;
139 unsigned int cpko_bss_start;
140 unsigned int cpko_text_offset;
141} cpko_section_layout;
142cpko_section_layout cpko_ps_section;
143
144
145int raise(int signo)
146{
147 return 0x00;
148}
149
150//__initdata DECLARE_COMPLETION(sysentry_done);
151
152extern unsigned int SysEntry(void);
153static int ko_Main_Thread(void * data)
154{
155 struct sched_param param = { .sched_priority = MAX_USER_RT_PRIO/2 - 3 };
156 int ret = 0;
157
158 sched_setscheduler(current, SCHED_FIFO, &param);
159
160 ret = SysEntry();
161 if(ret != 0)
162 panic("Main_Thread\n");
163
164 param.sched_priority = MAX_USER_RT_PRIO - 46;
165 sched_setscheduler(kthreadd_task, SCHED_FIFO, &param);
166
167 return 0;
168}
169
170int zte_modem_ko_start(void)
171{
172
173 kthread_run(ko_Main_Thread, NULL, "ZTEMainThread");
174 //wait_for_completion(&sysentry_done);
175
176 return 0;
177}
178static void cpko_sectioninfo_set(void)
179{
180 int ret;
181 struct file *fp;
182 mm_segment_t old_fs;
183 loff_t cpko_pos = 0;
184 struct cpps_globalModem globalVar;
185
186 fp = filp_open("/lib/cpko/cpko_secinfo.bin", 0, 0);
187 if(IS_ERR(fp) || fp == NULL)
188 panic("open file error\n");
189
190 old_fs = get_fs();
191 set_fs(KERNEL_DS);
192 ret = vfs_read(fp, (char*)&cpko_ps_section, sizeof(cpko_section_layout), &cpko_pos);
193 if (ret <= 0)
194 panic("read file error\n");
195 filp_close(fp, NULL);
196
xf.libfc6e712025-02-07 01:54:34 -0800197#ifdef CONFIG_MODEM_CODE_IS_MAPPING
xf.li771eb062025-02-09 23:05:11 -0800198 fp = filp_open("/lib/cpko/cpko.ko",0, 0);
199 if(IS_ERR(fp) || fp == NULL)
200 panic("open file error\n");
201 fp->f_ra.ra_pages = 0;
xf.libfc6e712025-02-07 01:54:34 -0800202#endif
xf.li771eb062025-02-09 23:05:11 -0800203
204 if (cpko_ps_section.cpko_text_start){
205 globalVar.cpko_text_start = (unsigned long)cpko_ps_section.cpko_text_start;
206 globalVar.cpko_rodata_start = (unsigned long)cpko_ps_section.cpko_rodata_start;
207 globalVar.cpko_data_start = (unsigned long)cpko_ps_section.cpko_data_start;
208 globalVar.cpko_bss_start = (unsigned long)cpko_ps_section.cpko_bss_start;
209
210
xf.libfc6e712025-02-07 01:54:34 -0800211#ifdef CONFIG_MODEM_CODE_IS_MAPPING
xf.li771eb062025-02-09 23:05:11 -0800212 globalVar.fp_code = fp;
213 globalVar.__utran_modem_text_start = (unsigned long)cpko_ps_section.__utran_modem_text_start;
214 globalVar.__lte_modem_text_start = (unsigned long)cpko_ps_section.__lte_modem_text_start;
215 globalVar.__comm_modem_text_start = (unsigned long)cpko_ps_section.__comm_modem_text_start;
216 globalVar.modem_text_end = (unsigned long)cpko_ps_section.modem_text_end;
217 globalVar.modem_offset = cpko_ps_section.cpko_text_offset;
xf.libfc6e712025-02-07 01:54:34 -0800218#endif
xf.li771eb062025-02-09 23:05:11 -0800219 cpps_globalVar_register(&globalVar);
220
xf.libfc6e712025-02-07 01:54:34 -0800221#ifdef CONFIG_MODEM_CODE_IS_MAPPING
xf.li771eb062025-02-09 23:05:11 -0800222 vfree_modem_section(globalVar.cpko_text_start, globalVar.modem_text_end);
xf.libfc6e712025-02-07 01:54:34 -0800223#endif
xf.li771eb062025-02-09 23:05:11 -0800224 }
225 else
226 panic("file error\n");
227}
228static int cpko_start(void)
229{
230 struct cpps_callbacks callback = {0};
231
232 //memset(&callback, 0 , sizeof(callback));
233
234 callback.zOss_ResetNVFactory = zOss_ResetNVFactory;
235 callback.zOss_NvramFlush = zOss_NvramFlush;
236 callback.zOss_NvItemWrite = zOss_NvItemWrite;
237 callback.zOss_NvItemWriteFactory = zOss_NvItemWriteFactory;
238 callback.zOss_NvItemRead = zOss_NvItemRead;
239 callback.zCatAgt_App_Write = zCatAgt_App_Write;
240 callback.zCatAgt_Kernel_Write = zCatAgt_Kernel_Write;
241 callback.linux_oss_tick_timer_function = linux_oss_tick_timer_function;
242 callback.zOss_GetExceptResetFlag = zOss_GetExceptResetFlag;
243 callback.zSys_ExceptReboot = zSys_ExceptReboot;
244 callback.zDrvRpMsg_Write = zDrvRpMsg_Write;
245 callback.zDrvRpMsg_CreateChannel = zDrvRpMsg_CreateChannel;
246 callback.zDrvRpMsg_RegCallBack = zDrvRpMsg_RegCallBack;
247 callback.zDrvLpm_IrqDisable = zDrvLpm_IrqDisable;
248 callback.zDrvInt_MaskIrq = zDrvInt_MaskIrq;
249 callback.zDrvLpm_IrqEnable = zDrvLpm_IrqEnable;
250 callback.zDrvInt_UnmaskIrq = zDrvInt_UnmaskIrq;
251 callback.Comm_Read_CP_TO_AP_Data = Comm_Read_CP_TO_AP_Data;
252 callback.Comm_Write_AP_TO_CP_Data = Comm_Write_AP_TO_CP_Data;
253 callback.zDrvEdcp_IsBusy = zDrvEdcp_IsBusy;
254
xf.libfc6e712025-02-07 01:54:34 -0800255#ifndef _USE_TestHarness
xf.li771eb062025-02-09 23:05:11 -0800256 callback.zAti2_Open = zAti2_Open;
257 callback.zAt_AutoTestInit = zAt_AutoTestInit;
258 callback.zAti2_IsExCid = zAti2_IsExCid;
259 callback.zPutSkb2Psbuf = zPutSkb2Psbuf;
260 //callback.zGetpsbufferHead = zGetpsbufferHead;
261 callback.zAti_CidIsUsed = zAti_CidIsUsed;
262 callback.zAti2_Send = zAti2_Send;
263 callback.zAti_GetDualCardStat = zAti_GetDualCardStat;
264 callback.zGetUpLinkSduSize = zGetUpLinkSduSize;
265 callback.zUsat_RegisterSendMsgFun = zUsat_RegisterSendMsgFun;
266 callback.zAti2_RegRecvCb = zAti2_RegRecvCb;
267 callback.zUsat_SendAtCmd = zUsat_SendAtCmd;
268 callback.RegSendDataToAmtAppFunction = RegSendDataToAmtAppFunction;
269 callback.zFreeDlBuf = zFreeDlBuf;
270 callback.AmtAgent_ComposeAndProcess = AmtAgent_ComposeAndProcess;
271 callback.zPs_IsTdMasterMode = zPs_IsTdMasterMode;
272 callback.zPs_IsLteMasterMode = zPs_IsLteMasterMode;
273 callback.zPs_IsFddMasterMode = zPs_IsFddMasterMode;
xf.libfc6e712025-02-07 01:54:34 -0800274#ifdef USE_VOICE_SUPPORT
xf.li771eb062025-02-09 23:05:11 -0800275 callback.zDrvVoice_Close = zDrvVoice_Close;
276 callback.zDrvVoice_ReadStart = zDrvVoice_ReadStart;
277 callback.zDrvVoice_ReadStop = zDrvVoice_ReadStop;
278 callback.zDrvVoice_WriteStart = zDrvVoice_WriteStart;
279 callback.zDrvVoice_WriteStop = zDrvVoice_WriteStop;
280 callback.zDrvVoice_Open = zDrvVoice_Open;
281 callback.zDrvVoice_WriteOneFrame = zDrvVoice_WriteOneFrame;
282 callback.zDrvVoice_ReadOneFrame = zDrvVoice_ReadOneFrame;
283 callback.halVoice_SetPathIn = halVoice_SetPathIn;
284 callback.halVoice_SetPathOut = halVoice_SetPathOut;
285 callback.halVoice_SetVolOut = halVoice_SetVolOut;
286 callback.halVoice_Enable = halVoice_Enable;
287 callback.halVoice_Open = halVoice_Open;
288 callback.halVoice_Disable = halVoice_Disable;
289 callback.halVoice_Close = halVoice_Close;
290 callback.zDrv_Audio_Printf = zDrv_Audio_Printf;
291 callback.zDrvVp_SetTone_Wrap = zDrvVp_SetTone_Wrap;
292 callback.zDrvVp_SetMute_Wrap = zDrvVp_SetMute_Wrap;
293 callback.zDrvVp_GetMute_Wrap = zDrvVp_GetMute_Wrap;
294 callback.zDrvVp_SetRxMute_Wrap = zDrvVp_SetRxMute_Wrap;
295 callback.zDrvVp_GetRxMute_Wrap = zDrvVp_GetRxMute_Wrap;
296 callback.zDrvVp_SetVol_Wrap = zDrvVp_SetVol_Wrap;
297 callback.zDrvVp_GetVol_Wrap = zDrvVp_GetVol_Wrap;
298 callback.zDrvVp_SetDtmfMute_Wrap = zDrvVp_SetDtmfMute_Wrap;
299 callback.zDrvVp_SetTxVol_Wrap = zDrvVp_SetTxVol_Wrap;
300 callback.zDrvVp_GetTxVol_Wrap = zDrvVp_GetTxVol_Wrap;
301 callback.zDrvVp_SetVol_Gain_Wrap = zDrvVp_SetVol_Gain_Wrap;
302 callback.zDrvVp_GetVol_Gain_Wrap = zDrvVp_GetVol_Gain_Wrap;
303 callback.zDrvVp_SetTxVol_Gain_Wrap = zDrvVp_SetTxVol_Gain_Wrap;
304 callback.zDrvVp_GetTxVol_Gain_Wrap = zDrvVp_GetTxVol_Gain_Wrap;
305 callback.zDrvVp_GetPath_Wrap = zDrvVp_GetPath_Wrap;
306 callback.zDrvVp_Loop = zDrvVp_Loop;
307 callback.zDrvVp_GetVpLoop_Wrap = zDrvVp_GetVpLoop_Wrap;
308 callback.zDrvVp_Soft_Dtmf_Loop = zDrvVp_Soft_Dtmf_Loop;
309 callback.zDrvDtmf_Detect_RegCallbacks = zDrvDtmf_Detect_RegCallbacks;
310 callback.zDrvVp_SetPath_Wrap = zDrvVp_SetPath_Wrap;
311 callback.zDrvVp_GetPath_Wrap = zDrvVp_GetPath_Wrap;
312 callback.halVoice_Open3G = halVoice_Open3G;
313 callback.halVoice_Close3G = halVoice_Close3G;
314 callback.zDrvVp_GetSlicFlag = zDrvVp_GetSlicFlag;
315 callback.zDrvVp_SetVoiceProc_Wrap = zDrvVp_SetVoiceProc_Wrap;
316 callback.zDrvVp_GetVoiceProc_Wrap = zDrvVp_GetVoiceProc_Wrap;
317 callback.zDrvVp_SetVoiceBuffer_Wrap = zDrvVp_SetVoiceBuffer_Wrap;
318 callback.zDrvVp_GetVoiceBuffer_Wrap = zDrvVp_GetVoiceBuffer_Wrap;
319 callback.zDrvVp_SetEchoDelay_Wrap = zDrvVp_SetEchoDelay_Wrap;
320 callback.zDrvVp_GetEchoDelay_Wrap = zDrvVp_GetEchoDelay_Wrap;
321 callback.zDrvVp_SetTxNsMode_Wrap = zDrvVp_SetTxNsMode_Wrap;
322 callback.zDrvVp_GetTxNsMode_Wrap = zDrvVp_GetTxNsMode_Wrap;
323 callback.zDrvVp_SetRxNsMode_Wrap = zDrvVp_SetRxNsMode_Wrap;
324 callback.zDrvVp_GetRxNsMode_Wrap = zDrvVp_GetRxNsMode_Wrap;
325 callback.zDrvVp_SetModuleState_Wrap = zDrvVp_SetModuleState_Wrap;
326 callback.zDrvVp_GetModuleState_Wrap = zDrvVp_GetModuleState_Wrap;
327 callback.mmp_AmrDecOpen = mmp_AmrDecOpen;
328 callback.mmp_AmrEncOpen = mmp_AmrEncOpen;
329 callback.mmp_AmrDecode = mmp_AmrDecode;
330 callback.mmp_AmrEncode = mmp_AmrEncode;
331 callback.mmp_AmrDecClose = mmp_AmrDecClose;
332 callback.mmp_AmrEncClose = mmp_AmrEncClose;
333 callback.zDrvVp_AudioDataOpen = zDrvVp_AudioDataOpen;
334 callback.zDrvVp_AudioDataWrite = zDrvVp_AudioDataWrite;
335 callback.zDrvVp_AudioDataClose = zDrvVp_AudioDataClose;
336 callback.zDrvVp_Status = zDrvVp_Status;
337 callback.zDrvVp_UpdateVoiceNv = zDrvVp_UpdateVoiceNv;
xf.libfc6e712025-02-07 01:54:34 -0800338#endif
xf.li771eb062025-02-09 23:05:11 -0800339 callback.psm_ModemDevSleep = psm_ModemDevSleep;
340 callback.psm_ModemSleepCheck = psm_ModemSleepCheck;
341 callback.psm_ModemSleepTimeGet = psm_ModemSleepTimeGet;
342 callback.psm_TimeCompensate = psm_TimeCompensate;
343 callback.psm_GetModemSleepFlagStatus = psm_GetModemSleepFlagStatus;
344
xf.libfc6e712025-02-07 01:54:34 -0800345#endif
xf.li771eb062025-02-09 23:05:11 -0800346
347
348 cpps_callbacks_register(&callback);
349 cpko_sectioninfo_set();
350 zte_modem_ko_start();
351
352 return 0;
353}
354
355static int cpko_stop(void)
356{
357 return 0;
358}
359
360module_init(cpko_start);
361module_exit(cpko_stop);