13IRX_ID(
"sdr_driver", 4, 1);
20static int module_start(
int ac,
char **av)
27 int initial_priority_main;
30 code = RegisterLibraryEntries(&_exp_sdrdrv);
34 Kprintf(
"SDR driver version 4.0.1 (C) SCEI\n");
35 initial_priority_main = 24;
36 g_eeCBInfo.m_initial_priority_cb = 24;
37 g_sdrInfo.m_thid_main = 0;
38 g_eeCBInfo.m_thid_cb = 0;
39 for ( i = 1; i < ac; i += 1 )
41 if ( !strncmp(
"thpri=", av[i], 6) )
48 initial_priority_main = strtol(p, 0, 10);
49 if ( (
unsigned int)(initial_priority_main - 9) >= 0x73 )
51 Kprintf(
" SDR driver error: invalid priority %d\n", initial_priority_main);
52 initial_priority_main = 24;
57 if ( *p ==
',' && isdigit(p[1]) )
59 g_eeCBInfo.m_initial_priority_cb = strtol(&p[1], 0, 10);
60 if ( (
unsigned int)(g_eeCBInfo.m_initial_priority_cb - 9) >= 0x73 )
62 Kprintf(
" SDR driver error: invalid priority %d\n", g_eeCBInfo.m_initial_priority_cb);
63 g_eeCBInfo.m_initial_priority_cb = 24;
66 if ( g_eeCBInfo.m_initial_priority_cb < initial_priority_main )
68 Kprintf(
" SDR driver ERROR:\n");
69 Kprintf(
" callback th. priority is higher than main th. priority.\n");
70 g_eeCBInfo.m_initial_priority_cb = initial_priority_main;
73 " SDR driver: thread priority: main=%d, callback=%d\n",
74 initial_priority_main,
75 g_eeCBInfo.m_initial_priority_cb);
78 thprarm.attr = 0x2000000;
79 thprarm.thread = sce_sdr_loop;
81 thprarm.stacksize = 4096;
83 thprarm.priority = initial_priority_main;
84 g_sdrInfo.m_thid_main = CreateThread(&thprarm);
85 if ( g_sdrInfo.m_thid_main <= 0 )
87 StartThread(g_sdrInfo.m_thid_main, &g_sdrInfo);
88 Kprintf(
" Exit rsd_main \n");
92static int module_stop(
int ac,
char **av)
101 code = ReleaseLibraryEntries(&_exp_sdrdrv);
105 sceSdSetTransIntrHandler(0, 0, 0);
106 sceSdSetTransIntrHandler(1, 0, 0);
107 sceSdSetSpu2IntrHandler(0, 0);
108 if ( g_eeCBInfo.m_thid_cb > 0 )
110 TerminateThread(g_eeCBInfo.m_thid_cb);
111 DeleteThread(g_eeCBInfo.m_thid_cb);
112 g_eeCBInfo.m_thid_cb = 0;
114 if ( g_sdrInfo.m_thid_main > 0 )
116 sceSifRemoveRpc(g_sdrInfo.m_rpc_sd, g_sdrInfo.m_rpc_qd);
117 sceSifRemoveRpcQueue(g_sdrInfo.m_rpc_qd);
118 TerminateThread(g_sdrInfo.m_thid_main);
119 DeleteThread(g_sdrInfo.m_thid_main);
120 g_sdrInfo.m_thid_main = 0;
122 Kprintf(
" sdrdrv: unloaded! \n");
126int _start(
int ac,
char **av)
128 return (ac >= 0) ? module_start(ac, av) : module_stop(-ac, av);
131int sceSdrChangeThreadPriority(
int priority_main,
int priority_cb)
137 if ( (
unsigned int)(priority_main - 9) >= 0x73 || (
unsigned int)(priority_cb - 9) >= 0x73 )
139 if ( priority_cb < priority_main )
141 Kprintf(
" SDR driver ERROR:\n");
142 Kprintf(
" callback th. priority is higher than main th. priority.\n");
144 cur_priority = (priority_cb < priority_main) ? priority_main : priority_cb;
145 ReferThreadStatus(0, &thstatus);
146 ChangeThreadPriority(0, 8);
148 if ( g_sdrInfo.m_thid_main > 0 )
149 ret = ChangeThreadPriority(g_sdrInfo.m_thid_main, priority_main);
152 if ( g_eeCBInfo.m_thid_cb > 0 )
153 ret = ChangeThreadPriority(g_eeCBInfo.m_thid_cb, cur_priority);
156 g_eeCBInfo.m_initial_priority_cb = cur_priority;
157 ChangeThreadPriority(0, thstatus.currentPriority);
int CpuResumeIntr(int state)
int CpuSuspendIntr(int *state)