Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <malloc.h>
- #include <ogcsys.h>
- #include <gccore.h>
- #include <ogc/ipc.h>
- #include <stdarg.h>
- #include <ctype.h>
- static void *xfb = NULL;
- static GXRModeObj *rmode = NULL;
- int btm_fd;
- typedef void (*Loader_Entry)(void);
- //Loader_Entry loader = (Loader_Entry)0x90000020;
- Loader_Entry loader = (Loader_Entry)0x80001800;
- char ascii(char s) {
- if(s < 0x20) return '.';
- if(s > 0x7E) return '.';
- return s;
- }
- void hexdump(void *d, int len)
- {
- u8 *data;
- int off=0;
- int i;
- data = (u8*)d;
- while(off<len) {
- printf("%08x ",off);
- for(i=0; i<8; i++) {
- if((i+off)>=len) {
- printf(" ");
- } else {
- printf("%02x ",data[off+i]);
- }
- }
- printf(" ");
- for(i=0; i<8; i++) {
- if((i+off)>=len) {
- printf(" ");
- } else {
- printf("%c",ascii(data[off+i]));
- }
- }
- printf("\n");
- off +=8;
- }
- }
- //HACK for now
- #define _ipc_hid 0
- struct _ioctlv_fmt_bufent {
- void *ipc_buf;
- void *output_buf;
- s32 copy_len;
- };
- struct _ioctlv_fmt_cbdata {
- ipccallback user_cb;
- void *usrdata;
- s32 num_bufs;
- struct _ioctlv_fmt_bufent *bufs;
- };
- s32 _ioctlv_fmt_cb(s32 result,void *usrdata)
- {
- struct _ioctlv_fmt_cbdata *cbdata;
- struct _ioctlv_fmt_bufent *pbuf;
- cbdata = (struct _ioctlv_fmt_cbdata*) usrdata;
- ipccallback user_cb;
- void *user_data;
- // deal with data buffers
- if(cbdata->bufs) {
- pbuf = cbdata->bufs;
- while(cbdata->num_bufs--) {
- if(pbuf->ipc_buf) {
- // copy data if needed
- if(pbuf->output_buf && pbuf->copy_len)
- memcpy(pbuf->output_buf, pbuf->ipc_buf, pbuf->copy_len);
- // then free the buffer
- iosFree(_ipc_hid, pbuf->ipc_buf);
- }
- pbuf++;
- }
- }
- user_cb = cbdata->user_cb;
- user_data = cbdata->usrdata;
- // free buffer list
- iosFree(_ipc_hid, cbdata->bufs);
- // free callback data
- iosFree(_ipc_hid, cbdata);
- // call the user callback
- if(user_cb)
- return user_cb(result, user_data);
- else
- return 0;
- }
- s32 _ios_ioctlv_fmt_parse(const char *format, va_list args, struct _ioctlv_fmt_cbdata *cbdata, s32 *cnt_in, s32 *cnt_io, ioctlv **argv)
- {
- int max_bufs;
- ioctlv *argp;
- struct _ioctlv_fmt_bufent *bufp;
- char type;
- int i;
- int ret;
- int len;
- char *ps;
- void *pdata;
- void *iodata;
- // this is an overestimation and includes a potential extra entry for the ':' separator
- // but that's okay
- max_bufs = strnlen(format,32);
- // sanity check
- if(max_bufs >= 32) return IPC_EINVAL;
- // allocate callback buffer list
- // max_bufs+1, since the first buffer to free is argv itself
- cbdata->bufs = iosAlloc(_ipc_hid, sizeof(struct _ioctlv_fmt_bufent)*(max_bufs+1));
- if(!cbdata->bufs) {
- return IPC_ENOMEM;
- }
- memset(cbdata->bufs, 0, sizeof(struct _ioctlv_fmt_bufent)*(max_bufs+1));
- bufp = cbdata->bufs;
- // allocate ioctl argv array
- argp = iosAlloc(_ipc_hid, sizeof(ioctlv)*max_bufs);
- if(!argp) {
- iosFree(_ipc_hid, cbdata->bufs);
- return IPC_ENOMEM;
- }
- memset(argp, 0, sizeof(ioctlv)*max_bufs);
- *argv = argp; //pass array to caller for ioctlv()
- // first buffer is argp
- cbdata->num_bufs = 1;
- bufp->ipc_buf = argp;
- bufp++;
- *cnt_in = 0;
- *cnt_io = 0;
- ret = 0;
- //parse the input arguments
- while(*format) {
- type = tolower(*format);
- switch(type) {
- case 'b':
- pdata = iosAlloc(_ipc_hid, 1);
- if(!pdata) {
- ret = IPC_ENOMEM;
- goto free_and_error;
- }
- *(u8*)pdata = va_arg(args, u32); //u32 because of promotion
- argp->data = pdata;
- argp++->len = 1;
- ++*cnt_in;
- bufp++->ipc_buf = pdata;
- cbdata->num_bufs++;
- break;
- case 'h':
- pdata = iosAlloc(_ipc_hid, 2);
- if(!pdata) {
- ret = IPC_ENOMEM;
- goto free_and_error;
- }
- *(u16*)pdata = va_arg(args, u32); //u32 because of promotion
- argp->data = pdata;
- argp++->len = 2;
- ++*cnt_in;
- bufp++->ipc_buf = pdata;
- cbdata->num_bufs++;
- break;
- case 'i':
- pdata = iosAlloc(_ipc_hid, 4);
- if(!pdata) {
- ret = IPC_ENOMEM;
- goto free_and_error;
- }
- *(u32*)pdata = va_arg(args, u32);
- argp->data = pdata;
- argp++->len = 4;
- ++*cnt_in;
- bufp++->ipc_buf = pdata;
- cbdata->num_bufs++;
- break;
- case 'd':
- argp->data = va_arg(args, void *);
- argp++->len = va_arg(args, u32);
- ++*cnt_in;
- break;
- case 's':
- ps = va_arg(args, char *);
- len = strnlen(ps, 256);
- if(len >= 256) { // sanity check
- ret = IPC_EINVAL;
- goto free_and_error;
- }
- pdata = iosAlloc(_ipc_hid, len+1);
- if(!pdata) {
- ret = IPC_ENOMEM;
- goto free_and_error;
- }
- memcpy(pdata, ps, len+1);
- argp->data = pdata;
- argp++->len = len+1;
- ++*cnt_in;
- bufp++->ipc_buf = pdata;
- cbdata->num_bufs++;
- break;
- case ':':
- format++; // skip colon
- goto parse_io_parms;
- default:
- ret = IPC_EINVAL;
- goto free_and_error;
- }
- format++;
- }
- parse_io_parms:
- //parse the input/output arguments
- while(*format) {
- type = tolower(*format);
- switch(type) {
- case 'b':
- pdata = iosAlloc(_ipc_hid, 1);
- if(!pdata) {
- ret = IPC_ENOMEM;
- goto free_and_error;
- }
- iodata = va_arg(args, u8 *);
- *(u8*)pdata = *(u8*)iodata;
- argp->data = pdata;
- argp++->len = 1;
- ++*cnt_io;
- bufp->ipc_buf = pdata;
- bufp->output_buf = iodata;
- bufp++->copy_len = 1;
- cbdata->num_bufs++;
- break;
- case 'h':
- pdata = iosAlloc(_ipc_hid, 1);
- if(!pdata) {
- ret = IPC_ENOMEM;
- goto free_and_error;
- }
- iodata = va_arg(args, u16 *);
- *(u16*)pdata = *(u16*)iodata;
- argp->data = pdata;
- argp++->len = 2;
- ++*cnt_io;
- bufp->ipc_buf = pdata;
- bufp->output_buf = iodata;
- bufp++->copy_len = 2;
- cbdata->num_bufs++;
- break;
- case 'i':
- pdata = iosAlloc(_ipc_hid, 4);
- if(!pdata) {
- ret = IPC_ENOMEM;
- goto free_and_error;
- }
- iodata = va_arg(args, u32 *);
- *(u32*)pdata = *(u32*)iodata;
- argp->data = pdata;
- argp++->len = 4;
- ++*cnt_io;
- bufp->ipc_buf = pdata;
- bufp->output_buf = iodata;
- bufp++->copy_len = 4;
- cbdata->num_bufs++;
- break;
- case 'd':
- argp->data = va_arg(args, void *);
- argp++->len = va_arg(args, u32);
- ++*cnt_io;
- break;
- default:
- ret = IPC_EINVAL;
- goto free_and_error;
- }
- format++;
- }
- return *cnt_in + *cnt_io;
- // free up all allocated buffers
- free_and_error:
- // this includes argv
- for(i=0; i<cbdata->num_bufs; i++) {
- iosFree(_ipc_hid, cbdata->bufs[i].ipc_buf);
- }
- // free buffers structure
- iosFree(_ipc_hid, cbdata->bufs);
- return ret;
- }
- s32 IOS_Ioctlv_Fmt(s32 fd, s32 ioctl, const char *format, ...)
- {
- va_list args;
- int ret;
- s32 cnt_in, cnt_io;
- struct _ioctlv_fmt_cbdata *cbdata;
- ioctlv *argv;
- cbdata = iosAlloc(_ipc_hid, sizeof(struct _ioctlv_fmt_cbdata));
- memset(cbdata, 0, sizeof(struct _ioctlv_fmt_cbdata));
- va_start(args, format);
- ret = _ios_ioctlv_fmt_parse(format, args, cbdata, &cnt_in, &cnt_io, &argv);
- va_end(args);
- if(ret < 0) {
- iosFree(_ipc_hid, cbdata);
- return ret;
- }
- ret = IOS_Ioctlv(fd, ioctl, cnt_in, cnt_io, argv);
- // call the callback manually to free buffers / copy
- cbdata->user_cb = NULL;
- _ioctlv_fmt_cb(ret, cbdata);
- return ret;
- }
- s32 IOS_IoctlvAsync_Fmt(s32 fd, s32 ioctl, ipccallback ipc_cb, void *usrdata, const char *format, ...)
- {
- va_list args;
- int ret;
- s32 cnt_in, cnt_io;
- struct _ioctlv_fmt_cbdata *cbdata;
- ioctlv *argv;
- cbdata = iosAlloc(_ipc_hid, sizeof(struct _ioctlv_fmt_cbdata));
- memset(cbdata, 0, sizeof(struct _ioctlv_fmt_cbdata));
- va_start(args, format);
- ret = _ios_ioctlv_fmt_parse(format, args, cbdata, &cnt_in, &cnt_io, &argv);
- va_end(args);
- if(ret < 0) {
- iosFree(_ipc_hid, cbdata);
- return ret;
- }
- cbdata->user_cb = ipc_cb;
- cbdata->usrdata = usrdata;
- ret = IOS_IoctlvAsync(fd, ioctl, cnt_in, cnt_io, argv, _ioctlv_fmt_cb, cbdata);
- return ret;
- }
- //-----------------------------------------------------------------------------------
- #define USB_IOCTL_CTRLMSG 0
- #define USB_IOCTL_BULKMSG 1
- #define USB_IOCTL_INTRMSG 2
- #define USB_IOCTL_GET_DEVICE_LIST 0xC
- #define USB_CREQ_H2D 0x00
- #define USB_CREQ_D2H 0x80
- #define USB_CREQ_STANDARD 0x00
- #define USB_CREQ_CLASS 0x20
- #define USB_CREQ_VENDOR 0x40
- #define USB_CREQ_DEVICE 0x00
- #define USB_CREQ_INTERFACE 0x01
- #define USB_CREQ_ENDPOINT 0x02
- #define USB_CREQ_OTHER 0x03
- #define SWAB16(x) ((((x)&0xFF)<<8)|((x)>>8))
- #define ALIGNED(n) __attribute__((aligned(n)))
- int usb_ctrl_msg(int fd, u8 bmRequestType, u8 bRequest, u16 wValue, u16 wIndex, void* payload, u16 wLength)
- {
- // printf("USB control: %x %x %x %x %x LEN %x BUF %p\n", fd, bmRequestType, bRequest, wValue, wIndex, wLength, payload);
- return IOS_Ioctlv_Fmt(fd, USB_IOCTL_CTRLMSG, "bbhhhb:d", bmRequestType, bRequest, SWAB16(wValue), SWAB16(wIndex), SWAB16(wLength), 0, payload, wLength);
- }
- // the following two functions work for both reads and writes!
- int usb_intr_msg(int fd, u8 bEndpoint, void* payload, u16 wLength)
- {
- // printf("USB interrupt: EP %x LEN %x BUF %p\n", bEndpoint, wLength, payload);
- return IOS_Ioctlv_Fmt(fd, USB_IOCTL_INTRMSG, "bh:d", bEndpoint, wLength, payload, wLength);
- }
- int usb_bulk_msg(int fd, u8 bEndpoint, void* payload, u16 wLength)
- {
- // printf("USB bulk: EP %x LEN %x BUF %p\n", bEndpoint, wLength, payload);
- return IOS_Ioctlv_Fmt(fd, USB_IOCTL_BULKMSG, "bh:d", bEndpoint, wLength, payload, wLength);
- }
- int usb_bulk_msg_async(int fd, u8 bEndpoint, void* payload, u16 wLength, ipccallback ipc_cb,void *usrdata)
- {
- // printf("USB bulk: EP %x LEN %x BUF %p\n", bEndpoint, wLength, payload);
- return IOS_IoctlvAsync_Fmt(fd, USB_IOCTL_BULKMSG, ipc_cb, usrdata, "bh:d", bEndpoint, wLength, payload, wLength);
- }
- // no worky yet
- int usb_get_device_list(int fd, u8 type)
- {
- int ret;
- static u8 rcnt[0x100] ALIGNED(0x20);
- static u8 buf[0x80] ALIGNED(0x20);
- memset(buf,0,sizeof(buf));
- rcnt[0] = 0xFF;
- ret = IOS_Ioctlv_Fmt(fd, USB_IOCTL_GET_DEVICE_LIST, "bb:bd", sizeof(buf)>>3, type, rcnt, buf, sizeof(buf));
- printf("USB dev list %d ret %d rcnt %d data:\n",type,ret,rcnt[0]);
- hexdump(buf,8);
- return ret;
- }
- #define EP_CONTROL 0x00
- #define EP_EVENTS 0x81
- #define EP_ACL_OUT 0x02
- #define EP_ACL_IN 0x82
- #define HCI_G_LINKCONTROL 1
- #define HCI_G_LINKPOLICY 2
- #define HCI_G_CONTROLLER 3
- #define HCI_G_INFORMATIONAL 4
- #define HCI_G_STATUS 5
- #define HCI_G_TESTING 6
- #define HCI_C_RESET 0x0003
- #define HCI_LC_CONNECT 0x0005
- #define HCI_PKTTYPE_DM1 0x0008
- #define HCI_PSRM_R2 2
- #define HCI_CLKOFF_INVALID 0
- #define HCI_NO_ROLESWITCH 0
- #define HCI_EV_CONNECTION_COMPLETE 0x03
- int bt_HCI_command(int fd, int ogf, int ocf, u8 *parameters, u8 parmlength) {
- int opcode;
- static u8 buffer[0x103] ALIGNED(0x40);
- opcode = (ocf&0x3FF) | ((ogf &0x3F)<<10);
- buffer[0] = opcode&0xFF;
- buffer[1] = opcode>>8;
- buffer[2] = parmlength;
- if(parameters && parmlength) {
- memcpy (&buffer[3], parameters, parmlength);
- } else {
- parmlength = 0; //make sure we don't pass around junk
- }
- return usb_ctrl_msg(fd, USB_CREQ_H2D|USB_CREQ_CLASS|USB_CREQ_DEVICE, 0, 0, 0, buffer, parmlength+3);
- }
- typedef struct {
- u8 event_code;
- u8 data_length;
- u8 *data;
- } HCI_Event;
- typedef struct {
- u16 chnd;
- int pb,bc;
- u16 data_length;
- u8 *data;
- } HCI_ACL_Data;
- int bt_HCI_recv_event(int fd, HCI_Event *ev) {
- static u8 buffer[0x102] ALIGNED(0x40);
- int res;
- res = usb_intr_msg(fd, EP_EVENTS, buffer, sizeof(buffer));
- ev->event_code = buffer[0];
- ev->data_length = buffer[1];
- ev->data = &buffer[2];
- printf("HCI event [%d]: Code 0x%x, length %d, data:\n",res,ev->event_code, ev->data_length);
- hexdump(ev->data, ev->data_length);
- return res;
- }
- int bt_HCI_reset(int fd) {
- return bt_HCI_command(fd, HCI_G_CONTROLLER, HCI_C_RESET, NULL, 0);
- }
- int bt_HCI_connect(int fd, u8 *bdaddr, u16 pkt_types, u8 psrm, u16 clkoff, u8 roleswitch) {
- static u8 data[13];
- int i;
- for(i=0;i<6;i++) data[i] = bdaddr[5-i];
- data[6] = pkt_types & 0xFF;
- data[7] = pkt_types >> 8;
- data[8] = psrm;
- data[9] = 0; //reserved
- data[10] = clkoff & 0xFF;
- data[11] = clkoff >> 8;
- data[12] = roleswitch;
- return bt_HCI_command(fd, HCI_G_LINKCONTROL, HCI_LC_CONNECT, data, sizeof(data));
- }
- int bt_HCI_send_ACL(int fd, u16 chnd, int pb, int bc, u16 length, u8 *data) {
- static u8 buffer[0x100] ALIGNED(0x40);
- printf("<ACL chnd %04x pb %d bc %d len %d data:\n",chnd,pb,bc,length);
- hexdump(data,length);
- chnd &= 0x0FFF;
- chnd |= pb<<12;
- chnd |= bc<<14;
- memcpy(&buffer[4],data,length);
- buffer[0] = chnd & 0xFF;
- buffer[1] = chnd >> 8;
- buffer[2] = length & 0xFF;
- buffer[3] = length >>8;
- return usb_bulk_msg(fd, EP_ACL_OUT, buffer, length+4);
- }
- int bt_HCI_recv_ACL(int fd, HCI_ACL_Data *acl) {
- static u8 buffer[0x40] ALIGNED(0x40);
- int res;
- res = usb_bulk_msg(fd, EP_ACL_IN, buffer, sizeof(buffer));
- acl->chnd = buffer[0] | (buffer[1]<<8);
- acl->pb = (acl->chnd & 0x3000)>>12;
- acl->bc = (acl->chnd & 0xC000)>>14;
- acl->chnd &= 0x0FFF;
- acl->data_length = buffer[2] | (buffer[3]<<8);
- acl->data = &buffer[4];
- printf(">ACL [%d]: chnd %04x pb %d bc %d len %d data:\n",res,acl->chnd, acl->pb, acl->bc, acl->data_length);
- hexdump(acl->data, acl->data_length);
- return res;
- }
- static volatile int flag = 0;
- static volatile int res;
- s32 _bt_cb(int r, void *data) {
- res = r;
- flag = 1;
- return 0;
- }
- int bt_HCI_recv_ACL_async(int fd, HCI_ACL_Data *acl) {
- static u8 buffer[0x40] ALIGNED(0x40);
- int res;
- flag = 0;
- res = usb_bulk_msg_async(fd, EP_ACL_IN, buffer, sizeof(buffer), _bt_cb, NULL);
- while(!flag) {
- VIDEO_WaitVSync();
- PAD_ScanPads();
- int buttonsDown = PAD_ButtonsHeld(0);
- if( (buttonsDown & PAD_TRIGGER_Z) && (buttonsDown & PAD_BUTTON_START)) {
- loader();
- }
- }
- flag = 0;
- acl->chnd = buffer[0] | (buffer[1]<<8);
- acl->pb = (acl->chnd & 0x3000)>>12;
- acl->bc = (acl->chnd & 0xC000)>>14;
- acl->chnd &= 0x0FFF;
- acl->data_length = buffer[2] | (buffer[3]<<8);
- acl->data = &buffer[4];
- printf(">ACL [%d]: chnd %04x pb %d bc %d len %d data:\n",res,acl->chnd, acl->pb, acl->bc, acl->data_length);
- hexdump(acl->data, acl->data_length);
- return res;
- }
- int bt_L2CAP_send(int fd, u16 chnd, u16 cid, u16 length, u8 *data)
- {
- static u8 buffer[0x1000] ALIGNED(0x20);
- memcpy(&buffer[4],data,length);
- buffer[0] = length & 0xFF;
- buffer[1] = length >> 8;
- buffer[2] = cid & 0xFF;
- buffer[3] = cid >> 8;
- return bt_HCI_send_ACL(fd, chnd, 2, 0, length+4, buffer);
- }
- void checkAndReload(void) {
- PAD_ScanPads();
- int buttonsDown = PAD_ButtonsHeld(0);
- if( (buttonsDown & PAD_TRIGGER_Z) && (buttonsDown & PAD_BUTTON_START)) {
- loader();
- }
- }
- int fd_stm_eh = -1;
- int fd_stm_imm = -1;
- static u32 stm_eh_in[0x8] __attribute__((aligned(0x20)));
- static u32 stm_eh_out[0x8] __attribute__((aligned(0x20)));
- #define IOCTL_STM_EVENTHOOK 0x1000
- #define IOCTL_STM_GET_IDLEMODE 0x3001
- #define IOCTL_STM_RELEASE_EH 0x3002
- #define IOCTL_STM_HOTRESET 0x2001
- #define IOCTL_STM_HOTRESET_FOR_PD 0x2002
- #define IOCTL_STM_SHUTDOWN 0x2003
- #define IOCTL_STM_IDLE 0x2004
- #define IOCTL_STM_WAKEUP 0x2005
- #define IOCTL_STM_VIDIMMING 0x5001
- #define IOCTL_STM_LEDFLASH 0x6001
- #define IOCTL_STM_LEDMODE 0x6002
- #define IOCTL_STM_READVER 0x7001
- #define IOCTL_STM_READDDRREG 0x4001
- #define IOCTL_STM_READDDRREG2 0x4002
- #define LED_NOEXEC 0x2
- #define LED_USER 0x1
- #define LED_OFF 0
- #define LED_DIM 1
- #define LED_BRIGHT 2
- #define _LED_DELAY(d) \
- (((d)<=0) ? 0x10 :\
- (((d)<0x00010) ? (((((d)>>0)&15)<<4)|0) :\
- (((d)<0x00020) ? (((((d)>>1)&15)<<4)|1) :\
- (((d)<0x00040) ? (((((d)>>2)&15)<<4)|2) :\
- (((d)<0x00080) ? (((((d)>>3)&15)<<4)|3) :\
- (((d)<0x00100) ? (((((d)>>4)&15)<<4)|4) :\
- (((d)<0x00200) ? (((((d)>>5)&15)<<4)|5) :\
- (((d)<0x00400) ? (((((d)>>6)&15)<<4)|6) :\
- (((d)<0x00800) ? (((((d)>>7)&15)<<4)|7) :\
- (((d)<0x01000) ? (((((d)>>8)&15)<<4)|8) :\
- (((d)<0x02000) ? (((((d)>>9)&15)<<4)|9) :\
- (((d)<0x04000) ? (((((d)>>10)&15)<<4)|10) :\
- (((d)<0x08000) ? (((((d)>>11)&15)<<4)|11) :\
- (((d)<0x10000) ? (((((d)>>12)&15)<<4)|12) :\
- (((d)<0x20000) ? (((((d)>>13)&15)<<4)|13) :\
- (((d)<0x40000) ? (((((d)>>14)&15)<<4)|14) :\
- (((d)<0x80000) ? (((((d)>>15)&15)<<4)|15) :\
- 0xFF)))))))))))))))))
- // Units of delay: 20ms
- // LED value: 0-128
- #define LED_VAL(duration, value) ((_LED_DELAY(duration)<<8) | (((value)>0x80)?0x80:(value)))
- #define LED_JUMP(to) ((to)&0xFF)
- #define LED_END (0xFF)
- // 2-16 loops
- #define LED_LOOP(iter, to) (((((iter)-1)<16)?((iter)-1):15)<<8) | LED_JUMP(to)
- int stmopen(void) {
- if(fd_stm_imm<0) {
- fd_stm_imm = IOS_Open("/dev/stm/immediate",0);
- if(fd_stm_imm<0) {
- printf("Immediate open failed!\n");
- return -1;
- }
- }
- return fd_stm_imm;
- }
- int STMCall(s32 call, void *buf1, s32 len1, void *buf2, s32 len2)
- {
- stmopen();
- return IOS_Ioctl(fd_stm_imm, call, buf1, len1, buf2, len2);
- }
- void ReleaseOldSTMCallback(void) {
- int ret;
- ret = STMCall(IOCTL_STM_RELEASE_EH, NULL, 0, NULL, 0);
- if(ret >= 0)
- printf("Old callback released!\n");
- else if(ret == -6)
- printf("No old callback existed, so none was released\n");
- else
- printf("Eventhook release failed with code %d\n",ret);
- }
- s32 stm_cb(s32 result, void *data) {
- int ret;
- if(result < 0) {
- printf("STM callback: Eventhook failed with code %d\n",result);
- return 0;
- }
- printf("STM callback: %d %08x %08x %08x %08x\n",result,stm_eh_out[0],stm_eh_out[1],stm_eh_out[2],stm_eh_out[3]);
- if(stm_eh_out[0]==0x20000) {
- loader();
- }
- memset(stm_eh_out,0,0x20);
- ret = IOS_IoctlAsync(fd_stm_eh,IOCTL_STM_EVENTHOOK, stm_eh_in, 0x20, stm_eh_out, 0x20, stm_cb, NULL);
- return 0;
- }
- void installResetCallback(void) {
- int ret;
- fd_stm_eh = IOS_Open("/dev/stm/eventhook",0);
- if(fd_stm_eh<0) {
- printf("Event hook open failed!\n");
- return;
- }
- memset(stm_eh_in,0,0x20);
- memset(stm_eh_out,0,0x20);
- ret = IOS_IoctlAsync(fd_stm_eh,IOCTL_STM_EVENTHOOK, stm_eh_in, 0x20, stm_eh_out, 0x20, stm_cb, NULL);
- if(ret<0) {
- printf("Eventhook install failed with code %d\n",ret);
- }
- }
- void waita(void) {
- while(1) {
- VIDEO_WaitVSync();
- PAD_ScanPads();
- int buttonsDown = PAD_ButtonsDown(0);
- if(buttonsDown & PAD_BUTTON_A)
- return;
- if( (buttonsDown & PAD_TRIGGER_Z) && (buttonsDown & PAD_BUTTON_START)) {
- loader();
- }
- }
- }
- u8 resetcmd[3] __attribute__((aligned(32))) = {
- 0x03,0x0C,0x00
- };
- void printvers(void) {
- printf("3140: %08x\n", *((u32*)0xC0003140));
- printf("3144: %08x\n", *((u32*)0xC0003144));
- }
- int main(int argc, char **argv) {
- static u8 buf[16] __attribute__((aligned(32)));
- int ret;
- int i;
- HCI_Event hciev;
- HCI_ACL_Data acldat;
- u16 dcid;
- u8 l2pkt[32];
- static u32 stmpk[0x20] __attribute__((aligned(32)));
- static u32 stmout[0x20] __attribute__((aligned(32)));
- u32 buffer;
- VIDEO_Init();
- PAD_Init();
- switch(VIDEO_GetCurrentTvMode()) {
- case VI_NTSC:
- rmode = &TVNtsc480IntDf;
- break;
- case VI_PAL:
- rmode = &TVPal528IntDf;
- break;
- case VI_MPAL:
- rmode = &TVMpal480IntDf;
- break;
- default:
- rmode = &TVNtsc480IntDf;
- break;
- }
- xfb = MEM_K0_TO_K1(SYS_AllocateFramebuffer(rmode));
- console_init(xfb,20,20,rmode->fbWidth,rmode->xfbHeight,rmode->fbWidth*VI_DISPLAY_PIX_SZ);
- VIDEO_Configure(rmode);
- VIDEO_SetNextFramebuffer(xfb);
- VIDEO_SetBlack(FALSE);
- VIDEO_Flush();
- VIDEO_WaitVSync();
- if(rmode->viTVMode&VI_NON_INTERLACE) VIDEO_WaitVSync();
- printf("\n\nHello World!\n");
- // printf("Closing FDs...\n");
- // for(i=0; i<14; i++) {
- // ret = IOS_Close(i);
- // }
- // ReleaseOldSTMCallback();
- installResetCallback();
- int es;
- /*
- stmpk[0] = 1;
- res = STMCall(IOCTL_STM_LEDMODE,stmpk,4,NULL,0);
- stmpk[0] = 5;
- res = STMCall(IOCTL_STM_LEDFLASH,stmpk,4,NULL,0);
- printvers();
- int num;
- static u32 title[2] __attribute__((aligned(32)));
- static u8 views[0xD8*16] __attribute__((aligned(32)));
- ioctlv vectors[3];
- title[0] = 1;
- title[1] = 35;
- es = IOS_Open("/dev/es",0);
- printf("Opening ES: %d\n",es);
- if(es >= 0) {
- vectors[0].data = title;
- vectors[0].len = 8;
- vectors[1].data = #
- vectors[1].len = 4;
- IOS_Ioctlv(es, 0x12, 1, 1, vectors);
- printf("Views: %d\n",num);
- if(num == 1) {
- vectors[0].data = title;
- vectors[0].len = 8;
- vectors[1].data = #
- vectors[1].len = 4;
- vectors[2].data = views;
- vectors[2].len = 0xD8;
- IOS_Ioctlv(es, 0x13, 2, 1, vectors);
- vectors[0].data = title;
- vectors[0].len = 8;
- vectors[1].data = views;
- vectors[1].len = 0xD8;
- printf("Rebooting IOS...\n");
- IOS_IoctlvReboot(es, 8, 2, 0, vectors);
- printf("We're alive!\n");
- }
- }
- printvers();
- */
- // installResetCallback();
- /* do {
- fd_stm_imm=-1;
- stmopen();
- //printf("STM open: %d\n",stmopen());
- } while(fd_stm_imm > 0);
- */
- //es = IOS_Open("/dev/es",0);
- //printf("Opening ES: %d\n",es);
- /*
- stmpk[0] = 1;
- res = STMCall(IOCTL_STM_LEDMODE,stmpk,4,NULL,0);
- stmpk[0] = 0x8000+20;
- res = IOS_Ioctl(fd_stm_imm, IOCTL_STM_LEDFLASH, stmpk, 4, NULL, 0);
- printf("STM call %04x: %d\n",0x8000,res);
- while(1) {
- waita();
- stmpk[0] = 1;
- res = STMCall(IOCTL_STM_LEDMODE,stmpk,4,NULL,0);
- waita();
- stmpk[0] = 2;
- res = STMCall(IOCTL_STM_LEDMODE,stmpk,4,NULL,0);
- }
- */
- /*
- stmpk[0] = LED_BRIGHT;
- res = STMCall(IOCTL_STM_LEDMODE,stmpk,4,NULL,0);
- static u16 stmdata[130];
- u16 *pattern;
- int pos = 0;
- int loop;
- int iloop;
- memset(stmdata,0,260);
- stmdata[0] = LED_USER;
- stmdata[1] = 0x8000;
- pattern = &stmdata[2];
- loop = pos;
- for(i=1;i<=16;i++) { // blink while increasing brightness
- pattern[pos++] = LED_VAL(1,0);
- pattern[pos++] = LED_VAL(1,0x10+i*7);
- }
- for(i=0;i<4;i++) { //loops 4*16 = 64 times
- iloop = pos;
- pattern[pos++] = LED_VAL(1,0); //blink at max brightness
- pattern[pos++] = LED_VAL(1,0x80);
- pattern[pos++] = LED_LOOP(16,iloop); //max loop is 16
- }
- for(i=16;i>0;i--) {
- pattern[pos++] = LED_VAL(1,0); // blink while descreasing brightness
- pattern[pos++] = LED_VAL(1,0x10+i*7);
- }
- pattern[pos++] = LED_VAL(30,0); // 30 off
- iloop = pos;
- for(i=0;i<=8;i++) {
- pattern[pos++] = LED_VAL(1,i*16); // fade in
- }
- for(i=8;i>=0;i--) {
- pattern[pos++] = LED_VAL(1,i*16); // fade out
- }
- pattern[pos++] = LED_LOOP(2,iloop); // loop the former twice
- pattern[pos++] = LED_VAL(6,0); // then 6 off
- pattern[pos++] = LED_JUMP(loop); // loop everything
- hexdump(pattern,2*pos);
- res = STMCall(IOCTL_STM_LEDFLASH,stmdata,260,NULL,0);
- printf("Res: %d\n",res);
- */
- /*
- btm_fd = IOS_Open("/dev/usb/kbd",0);
- printf("IOS open KBD: %d\n",btm_fd);
- buf[0] = 0;
- buf[1] = 0;
- for(i=0;i<256;i++) {
- buf[0] = i;
- res = IOS_Write(btm_fd, buf, 8);
- if(res>=0) printf("Write res %d: %d\n",i,res);
- }
- while(1) {
- IOS_Ioctl(btm_fd, 1, NULL, 0, buf, 16);
- hexdump(buf,16);
- }
- */
- /*
- stmpk[0] = 1;
- res = STMCall(IOCTL_STM_LEDMODE,stmpk,4,NULL,0);
- stmpk[0] = 5;
- res = STMCall(IOCTL_STM_LEDFLASH,stmpk,4,NULL,0);
- */
- // Module's VID and PID
- btm_fd = IOS_Open("/dev/usb/oh1/57e/305",0);
- printf("IOS open USB: %d\n",btm_fd);
- IOS_Ioctlv_Fmt(btm_fd, USB_IOCTL_CTRLMSG, "bbhhhb:d", 0x20, 0, 0, 0, 0x0300, 0, resetcmd, 3);
- // Bluetooth HCI reset command
- memcpy(buf,"\x03\x0c\x00",3);
- // Bluetooth request to control endpoint
- ret = IOS_Ioctlv_Fmt(btm_fd, 0, "bbhhhb:d", 0x20, 0, 0, 0, 0x0300, 0, buf, 3);
- printf("IOS ioctlv USB: %d\n",ret);
- if(btm_fd>0) {
- ret = bt_HCI_reset(btm_fd);
- printf("HCI reset to %d returned %d\n",btm_fd,ret);
- ret = bt_HCI_recv_event(btm_fd, &hciev);
- ret = bt_HCI_connect(btm_fd, (u8*)"\x00\x17\xAB\x33\x37\x65", HCI_PKTTYPE_DM1, HCI_PSRM_R2, HCI_CLKOFF_INVALID, HCI_NO_ROLESWITCH);
- printf("HCI connect to %d returned %d\n",btm_fd,ret);
- ret = bt_HCI_recv_event(btm_fd, &hciev);
- while(1) {
- checkAndReload();
- ret = bt_HCI_recv_event(btm_fd, &hciev);
- if(hciev.event_code == HCI_EV_CONNECTION_COMPLETE) {
- break;
- }
- VIDEO_WaitVSync();
- }
- if(hciev.data[0]) {
- printf("Connection failed!\n");
- } else {
- u16 chnd;
- chnd = hciev.data[1] | (hciev.data[2]<<8);
- printf("Connection successful! chnd: 0x%04x\n",chnd);
- ret = bt_L2CAP_send(btm_fd, chnd, 1, 8, (u8*)"\x02\x01\x04\x00\x13\x00\x41\x00");
- printf("L2CAP send to %d returned %d\n",btm_fd,ret);
- bt_HCI_recv_ACL_async(btm_fd, &acldat);
- bt_HCI_recv_ACL_async(btm_fd, &acldat);
- memcpy(&dcid, &acldat.data[8], 2);
- memcpy(l2pkt, "\x04\x01\x04\x00\xAA\xAA\x00\x00", 8);
- memcpy(&l2pkt[4], &dcid, 2);
- ret = bt_L2CAP_send(btm_fd, chnd, 1, 8, l2pkt);
- printf("L2CAP send to %d returned %d\n",btm_fd,ret);
- bt_HCI_recv_ACL_async(btm_fd, &acldat);
- bt_HCI_recv_ACL_async(btm_fd, &acldat);
- memcpy(l2pkt, "\x05\x01\x06\x00\xAA\xAA\x00\x00\x00\x00", 10);
- memcpy(&l2pkt[4], &dcid, 2);
- ret = bt_L2CAP_send(btm_fd, chnd, 1, 10, l2pkt);
- printf("L2CAP send to %d returned %d\n",btm_fd,ret);
- while(true) {
- bt_HCI_recv_ACL_async(btm_fd, &acldat);
- checkAndReload();
- }
- }
- }
- ret = IOS_Close(btm_fd);
- printf("IOS close USB: %d\n",ret);
- while(1) {
- VIDEO_WaitVSync();
- PAD_ScanPads();
- int buttonsDown = PAD_ButtonsHeld(0);
- if( (buttonsDown & PAD_TRIGGER_Z) && (buttonsDown & PAD_BUTTON_START)) {
- loader();
- }
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment