GPIO Registers: Difference between revisions

Gericom (talk | contribs)
m Oops
 
(8 intermediate revisions by 2 users not shown)
Line 4: Line 4:


{| class="wikitable" border="1"
{| class="wikitable" border="1"
!  Old3DS
!  Name
!  Name
!  Address
!  Address
!  Width
!  Width
!  GPIO [[GPIO_Services|bitmasks]] associated with this register
|-
|-
| GPIO_DATA0
| style="background: green" | Yes
| [[#GPIOn_DATA|GPIO1_DATA]]
| 0x10147000
| 0x10147000
| 2
| 1
| 0x1, 0x2, 0x4
|-
| style="background: green" | Yes
| [[#GPIOn_DATA|GPIO2_DATA]]
| 0x10147010
| 1
|-
| style="background: green" | Yes
| [[#GPIOn_DIR|GPIO2_DIR]]
| 0x10147011
| 1
|-
| style="background: green" | Yes
| [[#GPIOn_INTCFG|GPIO2_INTCFG]]
| 0x10147012
| 1
|-
|-
| GPIO_DATA1
| style="background: green" | Yes
| [[#0x10147010|0x10147010]]
| [[#GPIOn_INTEN|GPIO2_INTEN]]
| 4
| 0x10147013
| 0x8, 0x10
| 1
|-
|-
| GPIO_DATA2
| style="background: green" | Yes
| [[#GPIOn_DATA2|GPIO2_DATA2]]
| 0x10147014
| 0x10147014
| 2
| 2
| 0x20
|-
|-
| GPIO_DATA3
| style="background: green" | Yes
| [[#GPIOn_DATA|GPIO3_DATA]]
| 0x10147020
| 0x10147020
| 2
| 2
| 0x40, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000, 0x10000, 0x20000
|-
|-
| GPIO_DATA3_INTERRUPT_CLEAR
| style="background: green" | Yes
| [[#GPIOn_DIR|GPIO3_DIR]]
| 0x10147022
| 0x10147022
| 2
| 2
| 0x40, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000, 0x10000, 0x20000
|-
|-
| ??
| style="background: green" | Yes
| [[#GPIOn_INTCFG|GPIO3_INTCFG]]
| 0x10147024
| 0x10147024
| 2
| 2
| 0x40, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000, 0x10000, 0x20000
|-
|-
| ?
| style="background: green" | Yes
| [[#0x10147026|0x10147026]]
| [[#GPIOn_INTEN|GPIO3_INTEN]]
| 0x10147026
| 2
| 2
| ?
|-
|-
| GPIO_DATA4
| style="background: green" | Yes
| [[#GPIOn_DATA2|GPIO3_DATA2]]
| 0x10147028
| 0x10147028
| 2
| 2
| 0x40000
|-
|}
|}


Line 131: Line 147:
= Descriptions =
= Descriptions =


== 0x10147010 ==
== GPIO ==
=== GPIO pins ===


{| class="wikitable" border="1"
Only GPIO2 and GPIO3 pins have their interrupts configurable. Active low pins should be configured as "falling edge", and output ports shouldn't have interrupts enabled at all.
!  Bit
!  Description
|-
| 24
| Enable/disable? GPIO interrupt 0x64 (bitmask 0x8)
|-
| 25
| Enable/disable? GPIO interrupt 0x66 (bitmask 0x10)
|}


== 0x10147026 ==
[[GPIO Services]] bitmasks use this table, in that order:


{| class="wikitable" border="1"
{| class="wikitable" border="1"
!  Bit
!  Bit
!  IRQ ID
!  Description
!  Description
|-
|-
| 0-8
| 0
| ?
| ?
| Debug button (?) (active-low)
|-
|-
| 9
| 1
| Enable/disable interrupt 0x71.
| 0x63 (falling edge)
| Touch Screen (active low, 0 = screen pressed)
|-
|-
| 10-15
| 2
| ?
| 0x60 (falling edge)
|}
0x62 (rising edge)
 
| Shell closed
== GPIO_DATA ==
|-style="border-top: double"
 
| 0
=== GPIO_DATA0 ===
| 0x64
{| class="wikitable" border="1"
| Headphones inserted
!  Bit
!  Description
|-
|-
| 0-2
| 1
| Used for GPIO [[GPIO_Services|bitmask]] 0x7.
| 0x66
| TWL depop circuit (?) (active-low)
|-style="border-top: double"
| DATA2.0
| -
| WiFi mode/freq. select (0 = CTR, 1 = MP (DS WiFi))
|-style="border-top: double"
| 0
| 0x68
| C-stick interrupt
|-
|-
| 1
| 1
| DS EXTKEYIN Pen down (0 = touching, 1 = not touching)
| 0x69
| IrDA interrupt (active-low)
|-
| 2
| 0x6A
| Gyro interrupt
|-
|-
| 3
| 3
| Unused by GPIO-sysmodule and TwlBg.
| 0x6B
| C-stick "stop" (output)
|-
|-
| 4
| 4
| Only used by [[Bootloader|Boot11]].
| 0x6C
| IrDA TX-RC (output)
|-
|-
| 5-15
| 5
| Unused by GPIO-sysmodule and TwlBg.
| 0x6D
| IrDA RXD (active-low)
|-
| 6
| 0x6E
| NFC output1 (?)
|-
| 7
| 0x6F
| NFC output2 (?)
|-
| 8
| 0x70
| Headphones button/half-inserted (active-low)
|-
| 9
| 0x71
| MCU interrupt
|-
| 10
| 0x72
| NFC interrupt (?)
|-
| 11
| 0x73
| QTM output (?)
|-
|-style="border-top: double"
| DATA2.0
| -
| WiFi enable
|}
|}


=== GPIO_DATA1 ===
=== GPIOn_DATA ===
Pin values, one bit per pin.
 
=== GPIOn_DIR ===
Pin directions for GPIO2 and GPIO3, one bit per pin.
 
{| class="wikitable" border="1"
{| class="wikitable" border="1"
Bit
Value
!  Description
!  Description
|-
|-
| 0-1
| 0
| Used for GPIO [[GPIO_Services|bitmask]] 0x18.
| Input
|-
|-
| 2-31
| 1
| Unused by GPIO-sysmodule and TwlBg.
| Output
|}
|}


=== GPIO_DATA2 ===
=== GPIOn_INTCFG ===
Interrupt configuration for GPIO2 and GPIO3 pins (not the extra ones), one bit per pin.
 
{| class="wikitable" border="1"
{| class="wikitable" border="1"
Bit
Value
!  Description
!  Description
|-
|-
| 0
| 0
| Used for GPIO [[GPIO_Services|bitmask]] 0x20.
| Falling edge
|-
|-
| 1-15
| 1
| Unused by GPIO-sysmodule and TwlBg.
| Rising edge
|}
|}


=== GPIO_DATA3 ===
=== GPIOn_INTEN ===
Interrupt enable bits for GPIO2 and GPIO3 pins (not the extra ones), one bit per pin.
 
{| class="wikitable" border="1"
{| class="wikitable" border="1"
Bit
Value
!  Description
!  Description
|-
|-
| 0-11
| 0
| Used for GPIO [[GPIO_Services|bitmask]] 0x3FFC0.
| Interrupt disabled
|-
|-
| 12-31
| 1
| Unused by GPIO-sysmodule and TwlBg.
| Interrupt enabled
|}
|}


=== GPIO_DATA4 ===
=== GPIOn_DATA2 ===
Extra pins for GPIO2 and GPIO3 (one bit each). These two pins, in total, are not bound to any IRQ and are not configurable.
 
=== Default values ===
After bootrom initialization, these are the values of the registers:
 
{| class="wikitable" border="1"
{| class="wikitable" border="1"
Bit
Address
Description
Value
|-
| 0x10147000
| 0x0003
|-
| 0x10147010
| 0x00000002
|-
| 0x10147014
| 0x0000
|-
| 0x10147020
| 0x00000DFB
|-
|-
| 0
| 0x10147024
| Used for GPIO [[GPIO_Services|bitmask]] 0x40000.
| 0x00000000
|-
|-
| 1-15
| 0x10147028
| Unused by GPIO-sysmodule and TwlBg.
| 0x0000
|}
|}


Line 277: Line 358:
|-
|-
| 13
| 13
| ARM7 read command received? (writing 1 clears it seems)
| ARM7 write command received? (writing 1 clears it seems)
|-
|-
| 14
| 14
| ARM7 write command recieved? (writing 1 clears it seems)
| ARM7 read command recieved? (writing 1 clears it seems)
|-
|-
| 15
| 15
| DS SIO SI pin (rtc irq pin)
| DS SIO SI pin (rtc irq pin)
|}
= Default values =
After bootrom initialization, these are the values of the registers:
{| class="wikitable" border="1"
!  Address
!  Value
|-
| 0x10147000
| 0x0003
|-
| 0x10147010
| 0x00000002
|-
| 0x10147014
| 0x0000
|-
| 0x10147020
| 0x00000DFB
|-
| 0x10147024
| 0x00000000
|-
| 0x10147028
| 0x0000
|}
|}