30#define MODNAME "udptty"
38static int tty_sema = -1;
42static int tty_stdout_fd(
void);
43static int tty_write(
iop_file_t *file,
void *buf,
size_t size);
45IOMAN_RETURN_VALUE_IMPL(
EIO);
51 IOMAN_RETURN_VALUE(
EIO),
52 (
void *)&tty_stdout_fd,
53 (
void *)&tty_stdout_fd,
54 IOMAN_RETURN_VALUE(
EIO),
56 IOMAN_RETURN_VALUE(
EIO),
57 IOMAN_RETURN_VALUE(
EIO),
58 IOMAN_RETURN_VALUE(
EIO),
59 IOMAN_RETURN_VALUE(
EIO),
60 IOMAN_RETURN_VALUE(
EIO),
61 IOMAN_RETURN_VALUE(
EIO),
62 IOMAN_RETURN_VALUE(
EIO),
63 IOMAN_RETURN_VALUE(
EIO),
64 IOMAN_RETURN_VALUE(
EIO),
65 IOMAN_RETURN_VALUE(
EIO),
71 IOP_DT_CHAR | IOP_DT_CONS,
80#define PRNT_IO_BEGIN 0x200
81#define PRNT_IO_END 0x201
92static KprArg g_kprarg;
94#define KPR_BUFFER_SIZE 0x1000
95static char kprbuffer[KPR_BUFFER_SIZE];
97static void PrntFunc(
void *context,
int chr)
99 KprArg *kpa = (KprArg *)context;
110 PrntFunc(context,
'\r');
112 if (kpa->prpos < kpa->bsize)
113 kpa->kpbuf[kpa->prpos++] = chr;
118static int Kprnt(
void *context,
const char *format,
void *arg)
121 prnt(PrntFunc, context, format, arg);
126static int Kprintf_Handler(
void *context,
const char *format, va_list ap)
128 KprArg *kpa = (KprArg *)context;
134 iSetEventFlag(kpa->eflag, 1);
136 SetEventFlag(kpa->eflag, 1);
141static void KPRTTY_Thread(
void *args)
144 KprArg *kpa = (KprArg *)args;
147 WaitEventFlag(kpa->eflag, 1, WEF_AND | WEF_CLEAR, &flags);
150 write(1, kpa->kpbuf, kpa->prpos);
156static void kprtty_init(
void)
171 thp.thread = &KPRTTY_Thread;
172 thp.stacksize = 0x800;
175 kpa->eflag = CreateEventFlag(&efp);
176 kpa->bsize = KPR_BUFFER_SIZE;
177 kpa->kpbuf = kprbuffer;
181 thid = CreateThread(&thp);
182 StartThread(thid, (
void *)kpa);
184 KprintfSet(&Kprintf_Handler, kpa);
188int _start(
int argc,
char *argv[])
194 RegisterLibraryEntries(&_exp_udptty);
197 udp_socket = lwip_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
199 return MODULE_NO_RESIDENT_END;
201 DelDrv(tty_device.name);
203 if (AddDrv(&tty_device) < 0)
204 return MODULE_NO_RESIDENT_END;
207 open(DEVNAME
"00:", 0x1000 | O_RDWR);
210 open(DEVNAME
"00:", O_WRONLY);
213 open(DEVNAME
"00:", O_WRONLY);
215 printf(
"UDPTTY loaded!\n");
219 printf(
"KPRTTY enabled!\n");
222 return MODULE_RESIDENT_END;
227 lwip_close(udp_socket);
234static int udp_send(
void *buf,
size_t size)
238 peer.sin_family = AF_INET;
239 peer.sin_port = htons(18194);
240 peer.sin_addr.s_addr = inet_addr(
"255.255.255.255");
242 lwip_sendto(udp_socket, buf, size, 0, (
struct sockaddr *)&peer,
sizeof(peer));
253 if ((tty_sema = CreateMutex(IOP_MUTEX_UNLOCKED)) < 0)
263 DeleteSema(tty_sema);
267static int tty_stdout_fd(
void)
272static int tty_write(
iop_file_t *file,
void *buf,
size_t size)
279 res = udp_send(buf, size);
280 SignalSema(tty_sema);
int CpuInvokeInKmode(void *function,...)
int QueryIntrContext(void)