PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
sior_rpc.c
Go to the documentation of this file.
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright 2001-2004, 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
16#include <tamtypes.h>
17#include <kernel.h>
18#include <sifrpc.h>
19#include <stdarg.h>
20#include <string.h>
21#include <stdlib.h>
22#include <fcntl.h>
23#include <stdio.h>
24#include <sio.h>
25#include "sior_rpc.h"
26
29static u32 buffer[32] __attribute__((__aligned__(64)));
30
32#define IOP_MEM 0xbc000000
33
34enum {
35 SIOR_INIT = 1,
36 SIOR_PUTC,
37 SIOR_GETC,
38 SIOR_GETCBLOCK,
39 SIOR_WRITE,
40 SIOR_READ,
41 SIOR_PUTS,
42 SIOR_PUTSN,
43 SIOR_GETS,
44 SIOR_FLUSH
45};
46
48 u32 baudrate;
49 u8 lcr_ueps;
50 u8 lcr_upen;
51 u8 lcr_usbl;
52 u8 lcr_umode;
53};
54
55static void * sior_rpc_server(u32 funcno, void * data, int size) {
56 int res = 0, c;
57 size_t s;
58 char * p;
59 struct init_arguments_t * i;
60
61 (void)size;
62
63 switch(funcno) {
64 case SIOR_INIT:
65 i = (struct init_arguments_t *) data;
66 sio_init(i->baudrate, i->lcr_ueps, i->lcr_upen, i->lcr_usbl, i->lcr_umode);
67 break;
68 case SIOR_PUTC:
69 c = *((int *) data);
70 res = sio_putc(c);
71 break;
72 case SIOR_GETC:
73 res = sio_getc();
74 break;
75 case SIOR_GETCBLOCK:
76 res = sio_getc_block();
77 break;
78 case SIOR_WRITE:
79 p = *((char **) data) + IOP_MEM;
80 s = *(((size_t *) data) + 1);
81 DI();
82 ee_kmode_enter();
83 res = sio_write(p, s);
84 ee_kmode_exit();
85 EI();
86 break;
87 case SIOR_READ:
88 p = *((char **) data) + IOP_MEM;
89 s = *(((size_t *) data) + 1);
90 DI();
91 ee_kmode_enter();
92 res = sio_read(p, s);
93 ee_kmode_exit();
94 EI();
95 break;
96 case SIOR_PUTS:
97 p = *((char **) data) + IOP_MEM;
98 DI();
99 ee_kmode_enter();
100 res = sio_puts(p);
101 ee_kmode_exit();
102 EI();
103 break;
104 case SIOR_PUTSN:
105 p = *((char **) data) + IOP_MEM;
106 DI();
107 ee_kmode_enter();
108 res = sio_putsn(p);
109 ee_kmode_exit();
110 EI();
111 break;
112 case SIOR_GETS:
113 p = *((char **) data) + IOP_MEM;
114 DI();
115 ee_kmode_enter();
116 res = (int)sio_gets(p);
117 ee_kmode_exit();
118 EI();
119 break;
120 case SIOR_FLUSH:
121 sio_flush();
122 break;
123 }
124
125 *((int *) data) = res;
126
127 return data;
128}
129
130static void sior_thread(void) {
131 sceSifInitRpc(0);
132 sceSifSetRpcQueue(&qd, GetThreadId());
133 sceSifRegisterRpc(&Sd0, SIOR_IRX, (SifRpcFunc_t)sior_rpc_server, buffer, NULL, NULL, &qd);
134 sceSifRpcLoop(&qd);
135}
136
137int SIOR_Init(int priority)
138{
139 static int sior_init_done = 0;
140 static u8 stack[4096];
141 int thid;
142 ee_thread_t t;
143
144 if (sior_init_done)
145 return 0;
146
147 t.func = sior_thread;
148 t.gp_reg = 0;
149 t.initial_priority = priority;
150 t.stack = stack;
151 t.stack_size = 4096;
152 if ((thid = CreateThread(&t)) < 0) {
153 printf("Error creating SIO Remote EE-thread.\n");
154 return thid;
155 }
156 StartThread(thid, NULL);
157
158 sior_init_done = 1;
159 return thid;
160}
typedef __attribute__
Definition tlbfunc.c:60
void sio_flush(void)
Definition sior.c:89
int sio_getc_block(void)
Definition sior.c:52
size_t sio_read(void *buf, size_t size)
char * sio_gets(char *str)
Definition sior.c:83
size_t sio_write(void *buf, size_t size)
#define IOP_MEM
Definition sior_rpc.c:32