Changes

3,377 bytes added ,  21:39, 25 November 2021
Clarify PDC interrupt use
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 =
215

edits