PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
sdd_main.c
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright ps2dev - http://www.ps2dev.org
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9*/
10
11#include <sdr_i.h>
12
13IRX_ID("sdr_driver", 4, 1);
14// Based on the module from SDK 3.1.0.
15
16extern struct irx_export_table _exp_sdrdrv;
17// Unofficial: wrap members for relative access
18SdrInfo g_sdrInfo;
19
20static int module_start(int ac, char **av)
21{
22 int code;
23 int i;
24 iop_thread_t thprarm;
25 int state;
26 // Unofficial: make local
27 int initial_priority_main;
28
29 CpuSuspendIntr(&state);
30 code = RegisterLibraryEntries(&_exp_sdrdrv);
31 CpuResumeIntr(state);
32 if ( code )
33 return 1;
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 )
40 {
41 if ( !strncmp("thpri=", av[i], 6) )
42 {
43 const char *p;
44
45 p = av[i] + 6;
46 if ( isdigit(*p) )
47 {
48 initial_priority_main = strtol(p, 0, 10);
49 if ( (unsigned int)(initial_priority_main - 9) >= 0x73 )
50 {
51 Kprintf(" SDR driver error: invalid priority %d\n", initial_priority_main);
52 initial_priority_main = 24;
53 }
54 }
55 while ( isdigit(*p) )
56 p += 1;
57 if ( *p == ',' && isdigit(p[1]) )
58 {
59 g_eeCBInfo.m_initial_priority_cb = strtol(&p[1], 0, 10);
60 if ( (unsigned int)(g_eeCBInfo.m_initial_priority_cb - 9) >= 0x73 )
61 {
62 Kprintf(" SDR driver error: invalid priority %d\n", g_eeCBInfo.m_initial_priority_cb);
63 g_eeCBInfo.m_initial_priority_cb = 24;
64 }
65 }
66 if ( g_eeCBInfo.m_initial_priority_cb < initial_priority_main )
67 {
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;
71 }
72 Kprintf(
73 " SDR driver: thread priority: main=%d, callback=%d\n",
74 initial_priority_main,
75 g_eeCBInfo.m_initial_priority_cb);
76 }
77 }
78 thprarm.attr = 0x2000000;
79 thprarm.thread = sce_sdr_loop;
80 // Unofficial: original stack size was 2048
81 thprarm.stacksize = 4096;
82 thprarm.option = 0;
83 thprarm.priority = initial_priority_main;
84 g_sdrInfo.m_thid_main = CreateThread(&thprarm);
85 if ( g_sdrInfo.m_thid_main <= 0 )
86 return 1;
87 StartThread(g_sdrInfo.m_thid_main, &g_sdrInfo);
88 Kprintf(" Exit rsd_main \n");
89 return 2;
90}
91
92static int module_stop(int ac, char **av)
93{
94 int code;
95 int state;
96
97 (void)ac;
98 (void)av;
99
100 CpuSuspendIntr(&state);
101 code = ReleaseLibraryEntries(&_exp_sdrdrv);
102 CpuResumeIntr(state);
103 if ( code )
104 return 2;
105 sceSdSetTransIntrHandler(0, 0, 0);
106 sceSdSetTransIntrHandler(1, 0, 0);
107 sceSdSetSpu2IntrHandler(0, 0);
108 if ( g_eeCBInfo.m_thid_cb > 0 )
109 {
110 TerminateThread(g_eeCBInfo.m_thid_cb);
111 DeleteThread(g_eeCBInfo.m_thid_cb);
112 g_eeCBInfo.m_thid_cb = 0;
113 }
114 if ( g_sdrInfo.m_thid_main > 0 )
115 {
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;
121 }
122 Kprintf(" sdrdrv: unloaded! \n");
123 return 1;
124}
125
126int _start(int ac, char **av)
127{
128 return (ac >= 0) ? module_start(ac, av) : module_stop(-ac, av);
129}
130
131int sceSdrChangeThreadPriority(int priority_main, int priority_cb)
132{
133 int cur_priority;
134 int ret;
135 iop_thread_info_t thstatus;
136
137 if ( (unsigned int)(priority_main - 9) >= 0x73 || (unsigned int)(priority_cb - 9) >= 0x73 )
138 return -403;
139 if ( priority_cb < priority_main )
140 {
141 Kprintf(" SDR driver ERROR:\n");
142 Kprintf(" callback th. priority is higher than main th. priority.\n");
143 }
144 cur_priority = (priority_cb < priority_main) ? priority_main : priority_cb;
145 ReferThreadStatus(0, &thstatus);
146 ChangeThreadPriority(0, 8);
147 ret = 0;
148 if ( g_sdrInfo.m_thid_main > 0 )
149 ret = ChangeThreadPriority(g_sdrInfo.m_thid_main, priority_main);
150 if ( ret < 0 )
151 return ret;
152 if ( g_eeCBInfo.m_thid_cb > 0 )
153 ret = ChangeThreadPriority(g_eeCBInfo.m_thid_cb, cur_priority);
154 if ( ret < 0 )
155 return ret;
156 g_eeCBInfo.m_initial_priority_cb = cur_priority;
157 ChangeThreadPriority(0, thstatus.currentPriority);
158 return 0;
159}
int CpuResumeIntr(int state)
Definition intrman.c:227
int CpuSuspendIntr(int *state)
Definition intrman.c:205