Line 14: |
Line 14: |
| | 0 | | | 0 |
| | | | | |
− | | MPCore software-interrupt. Not configured.
| + | | MPCore software-interrupt. Used by Kernel11 to sync cores in crt0. |
− | |-
| |
− | | 0x1
| |
− | |
| |
− | | MPCore software-interrupt. Used by BOOT11 to kickstart Core1. | |
| |- | | |- |
− | | 0x2-0x3 | + | | 0x1-0x3 |
| | | | | |
− | | MPCore software-interrupt. Seem to be unused. | + | | MPCore software-interrupt. Used by Boot11 and Kernel11 to kickstart Core1/2/3, and by Kernel11 to sync cores in crt0. |
| |- | | |- |
| | 0x4 | | | 0x4 |
| | Kernel | | | Kernel |
− | | MPCore software-interrupt. Used to manage the performance counter. | + | | MPCore software-interrupt. Used to manage the performance counter. Also used by Kernel11 during crt0 to sync up. |
| |- | | |- |
| | 0x5 | | | 0x5 |
Line 92: |
Line 88: |
| | 0x2A | | | 0x2A |
| | gsp, TwlBg | | | gsp, TwlBg |
− | | PDC0 (VBlank0) | + | | PDC0 (Top screen VBlank0, HBlank0) |
| |- | | |- |
| | 0x2B | | | 0x2B |
| | gsp, TwlBg | | | gsp, TwlBg |
− | | PDC1 (VBlank1) | + | | PDC1 (Bottom screen VBlank1, HBlank1) |
| |- | | |- |
| | 0x2C | | | 0x2C |
Line 216: |
Line 212: |
| | 0x58 | | | 0x58 |
| | Kernel | | | Kernel |
− | | PDN Wake Event | + | | PDN (wake event or SoC mode changed) |
| |- | | |- |
| | 0x59 | | | 0x59 |
Line 225: |
Line 221: |
| | mic | | | mic |
| | General microphone interrupt (?) | | | General microphone interrupt (?) |
| + | |- |
| + | | 0x5B |
| + | | - |
| + | | [[HID_Registers#HID_PAD_CNT|HID_PAD_CNT]] |
| |- | | |- |
| | 0x5C | | | 0x5C |
Line 236: |
Line 236: |
| | 0x60 | | | 0x60 |
| | gpio, TwlBg | | | gpio, TwlBg |
− | | Shell opened | + | | Shell opened (GPIO1_2 falling edge) |
| |- | | |- |
| | 0x62 | | | 0x62 |
| | gpio, TwlBg | | | gpio, TwlBg |
− | | Shell closed | + | | Shell closed (GPIO1_2 rising edge) |
| |- | | |- |
| | 0x63 | | | 0x63 |
| | gpio, TwlBg | | | gpio, TwlBg |
− | | Touchscreen Pen Down | + | | Touch Screen pressed (GPIO1_1 falling edge) |
| |- | | |- |
| | 0x64 | | | 0x64 |
| | gpio, TwlBg | | | gpio, TwlBg |
− | | Headphone jack plugged in/out | + | | Headphones inserted (GPIO2_0) |
| |- | | |- |
| | 0x66 | | | 0x66 |
| | gpio, TwlBg | | | gpio, TwlBg |
− | | GPIO_DATA1.bit1 (sfio = ?) | + | | TWL depop circuit (GPIO2_1) |
| |- | | |- |
| | 0x68 | | | 0x68 |
| | gpio, TwlBg | | | gpio, TwlBg |
− | | C-stick Interrupt | + | | C-stick interrupt (GPIO3_0) |
| |- | | |- |
| | 0x69 | | | 0x69 |
| | gpio, TwlBg | | | gpio, TwlBg |
− | | IrDA Interrupt | + | | IrDA interrupt (active-low) (GPIO3_1) |
| |- | | |- |
| | 0x6A | | | 0x6A |
| | gpio, TwlBg | | | gpio, TwlBg |
− | | Gyro Interrupt | + | | Gyro interrupt (GPIO3_2) |
| |- | | |- |
| | 0x6B | | | 0x6B |
| | gpio, TwlBg | | | gpio, TwlBg |
− | | GPIO_DATA3.bit3 (sfio = ?) | + | | C-stick "stop" (output) (GPIO3_3) |
| |- | | |- |
| | 0x6C | | | 0x6C |
| | gpio, TwlBg | | | gpio, TwlBg |
− | | GPIO_DATA3.bit4 (sfio = ?) | + | | IrDA TX-RC (output) (GPIO3_4) |
| |- | | |- |
| | 0x6D | | | 0x6D |
| | gpio, TwlBg | | | gpio, TwlBg |
− | | GPIO_DATA3.bit5 (sfio = ?) | + | | IrDA RXD (GPIO3_5) |
| |- | | |- |
| | 0x6E | | | 0x6E |
| | gpio, TwlBg | | | gpio, TwlBg |
− | | GPIO_DATA3.bit6 (sfio = ?) | + | | NFC output1 (?) (GPIO3_6) |
| |- | | |- |
| | 0x6F | | | 0x6F |
| | gpio, TwlBg | | | gpio, TwlBg |
− | | GPIO_DATA3.bit7 (sfio = ?) | + | | NFC output2 (?) (GPIO3_7) |
| |- | | |- |
| | 0x70 | | | 0x70 |
| | gpio, TwlBg | | | gpio, TwlBg |
− | | GPIO_DATA3.bit8 (sfio = ?) | + | | Headphones button/half-inserted (active-low) (GPIO3_8) |
| |- | | |- |
| | 0x71 | | | 0x71 |
| | gpio, TwlBg | | | gpio, TwlBg |
− | | MCU (HOME/POWER pressed/released or WiFi switch pressed, etc.) | + | | MCU interrupt (GPIO3_9) |
| |- | | |- |
| | 0x72 | | | 0x72 |
| | gpio, TwlBg | | | gpio, TwlBg |
− | | NFC | + | | NFC interrupt (?) (GPIO3_10) |
| |- | | |- |
| | 0x73 | | | 0x73 |
| | TwlBg | | | TwlBg |
− | | GPIO_DATA3.bit11 (sfio = ?) | + | | QTM output (?) (GPIO3_11) |
| |- | | |- |
| | 0x74 | | | 0x74 |
Line 326: |
Line 326: |
| | | |
| | | |
− | There are 2 tables in the ARM11 kernel: the first has 32 * 2(or 32 * 4) 8-byte entries. This table is for the private interrupts that belong to each core. The data for each interrupt can be found by doing table_base + (core_num * 0x100) + (intr_num * 8). The second table is for public hardware interrupts and the data for each interrupt can be retrieved by doing table_base + (intr_num * 8). | + | There are 2 tables in the Arm11 kernel: the first has 32 * 2(or 32 * 4) 8-byte entries. This table is for the private interrupts that belong to each core. The data for each interrupt can be found by doing table_base + (core_num * 0x100) + (intr_num * 8). The second table is for public hardware interrupts and the data for each interrupt can be retrieved by doing table_base + (intr_num * 8). |
| + | |
| + | The Arm11 kernel configures interrupts the following way (it seems the GPIO IRQ layout doesn't match released 3DS models): |
| + | |
| + | <nowiki>Interrupts 0x00 to 0x1F: edge-triggered, N-N |
| + | Interrupt 0x20: level-sensitive, 1-N |
| + | Interrupt 0x21: level-sensitive, 1-N |
| + | Interrupt 0x22: level-sensitive, 1-N |
| + | Interrupt 0x23: level-sensitive, 1-N |
| + | Interrupt 0x24: edge-triggered, 1-N |
| + | Interrupt 0x25: level-sensitive, 1-N |
| + | Interrupt 0x28: level-sensitive, 1-N |
| + | Interrupt 0x29: level-sensitive, 1-N |
| + | Interrupt 0x2a: level-sensitive, 1-N |
| + | Interrupt 0x2b: level-sensitive, 1-N |
| + | Interrupt 0x2c: level-sensitive, 1-N |
| + | Interrupt 0x2d: level-sensitive, 1-N |
| + | Interrupt 0x30: level-sensitive, 1-N |
| + | Interrupt 0x31: level-sensitive, 1-N |
| + | Interrupt 0x32: level-sensitive, 1-N |
| + | Interrupt 0x33: level-sensitive, 1-N |
| + | Interrupt 0x34: level-sensitive, 1-N |
| + | Interrupt 0x35: level-sensitive, 1-N |
| + | Interrupt 0x36: level-sensitive, 1-N |
| + | Interrupt 0x37: level-sensitive, 1-N |
| + | Interrupt 0x38: level-sensitive, 1-N |
| + | Interrupt 0x39: level-sensitive, 1-N |
| + | Interrupt 0x3a: level-sensitive, 1-N |
| + | Interrupt 0x3b: level-sensitive, 1-N |
| + | Interrupt 0x40: edge-triggered, 1-N |
| + | Interrupt 0x41: edge-triggered, 1-N |
| + | Interrupt 0x42: edge-triggered, 1-N |
| + | Interrupt 0x43: edge-triggered, 1-N |
| + | Interrupt 0x44: edge-triggered, 1-N |
| + | Interrupt 0x45: edge-triggered, 1-N |
| + | Interrupt 0x46: edge-triggered, 1-N |
| + | Interrupt 0x48: edge-triggered, 1-N |
| + | Interrupt 0x49: edge-triggered, 1-N |
| + | Interrupt 0x4a: edge-triggered, 1-N |
| + | Interrupt 0x4b: edge-triggered, 1-N |
| + | Interrupt 0x4c: edge-triggered, 1-N |
| + | Interrupt 0x4d: edge-triggered, 1-N |
| + | Interrupt 0x4e: edge-triggered, 1-N |
| + | Interrupt 0x4f: level-sensitive, 1-N |
| + | Interrupt 0x50: edge-triggered, 1-N |
| + | Interrupt 0x51: edge-triggered, 1-N |
| + | Interrupt 0x52: edge-triggered, 1-N |
| + | Interrupt 0x53: edge-triggered, 1-N |
| + | Interrupt 0x54: edge-triggered, 1-N |
| + | Interrupt 0x55: edge-triggered, 1-N |
| + | Interrupt 0x56: edge-triggered, 1-N |
| + | Interrupt 0x57: edge-triggered, 1-N |
| + | Interrupt 0x58: level-sensitive, 1-N |
| + | Interrupt 0x59: edge-triggered, 1-N |
| + | Interrupt 0x5a: edge-triggered, 1-N |
| + | Interrupt 0x5b: edge-triggered, 1-N |
| + | Interrupt 0x5f: edge-triggered, 1-N |
| + | Interrupt 0x60: edge-triggered, 1-N |
| + | Interrupt 0x61: edge-triggered, 1-N |
| + | Interrupt 0x64: edge-triggered, 1-N |
| + | Interrupt 0x65: edge-triggered, 1-N |
| + | Interrupt 0x66: edge-triggered, 1-N |
| + | Interrupt 0x68: edge-triggered, 1-N |
| + | Interrupt 0x69: edge-triggered, 1-N |
| + | Interrupt 0x6a: edge-triggered, 1-N |
| + | Interrupt 0x6b: edge-triggered, 1-N |
| + | Interrupt 0x6c: edge-triggered, 1-N |
| + | Interrupt 0x6d: edge-triggered, 1-N |
| + | Interrupt 0x6e: edge-triggered, 1-N |
| + | Interrupt 0x6f: edge-triggered, 1-N |
| + | Interrupt 0x70: edge-triggered, 1-N |
| + | Interrupt 0x71: edge-triggered, 1-N |
| + | Interrupt 0x72: edge-triggered, 1-N |
| + | Interrupt 0x73: edge-triggered, 1-N |
| + | Interrupt 0x74: edge-triggered, 1-N |
| + | Interrupt 0x75: edge-triggered, 1-N |
| + | Interrupt 0x76: level-sensitive, 1-N |
| + | Interrupt 0x77: level-sensitive, 1-N |
| + | Interrupt 0x78: edge-triggered, 1-N |
| + | Interrupt 0x79: level-sensitive, 1-N |
| + | Interrupt 0x7a: level-sensitive, 1-N |
| + | Interrupt 0x7b: level-sensitive, 1-N |
| + | Interrupt 0x7c: level-sensitive, 1-N |
| + | Interrupt 0x7d: level-sensitive, 1-N</nowiki> |
| | | |
| = InterruptData = | | = InterruptData = |