Difference between revisions of "GPIO Services"

From 3dbrew
Jump to navigation Jump to search
m (→‎GPIO Bits: 0x100->Gyroscope)
 
(12 intermediate revisions by 4 users not shown)
Line 41: Line 41:
 
!  Uses [[GPIO_Registers|GPIO Regs]]
 
!  Uses [[GPIO_Registers|GPIO Regs]]
 
|-
 
|-
| 0x0001....
+
| 0x00010040
| ?(u32 unk1,u32* ret)
+
| u32 GetRegPart1(u32 mask)
 
| 0x10147010, 0x10147020
 
| 0x10147010, 0x10147020
 
|-
 
|-
 
| 0x00020080
 
| 0x00020080
| ?(u32 unk1,u32 unk2)
+
| void SetRegPart1(u32 value, u32 mask)
 
| 0x10147010, 0x10147020
 
| 0x10147010, 0x10147020
 
|-
 
|-
| 0x0003....
+
| 0x00030040
| ?(u32 unk1,u32* ret)
+
| u32 GetRegPart2(u32 mask)
 
| 0x10147010, 0x10147024
 
| 0x10147010, 0x10147024
 
|-
 
|-
 
| 0x00040080
 
| 0x00040080
| ?(u32 unk1,u32 unk2)
+
| u32 SetRegPart2(u32 value, u32 mask)
 
| 0x10147010, 0x10147024
 
| 0x10147010, 0x10147024
 
|-
 
|-
| 0x0005....
+
| 0x00050040
| ?(u32 unk1,u32* ret)
+
| u32 GetInterruptMask(u32 mask)
 
| 0x10147010, 0x10147024
 
| 0x10147010, 0x10147024
 
|-
 
|-
 
| 0x00060080
 
| 0x00060080
| ?(u32 unk1,u32 unk2)
+
| void SetInterruptMask(u32 value, u32 mask)
 
| 0x10147010, 0x10147024
 
| 0x10147010, 0x10147024
 
|-
 
|-
 
| 0x00070040
 
| 0x00070040
| GetIRGPIO(u32 bitmask) Output u32 is written to cmdreply[2].
+
| [[GPIO:GetGPIOData|GetGPIOData]]
 
| 0x10147000, 0x10147010, 0x10147014, 0x10147020, 0x10147028
 
| 0x10147000, 0x10147010, 0x10147014, 0x10147020, 0x10147028
 
|-
 
|-
 
| 0x00080080
 
| 0x00080080
| SetIRGPIO(u32 unk1,u32 unk2)
+
| [[GPIO:SetGPIOData|SetGPIOData]]
 
| 0x10147010, 0x10147014, 0x10147020, 0x10147028
 
| 0x10147010, 0x10147014, 0x10147020, 0x10147028
 
|-
 
|-
Line 83: Line 83:
  
 
=GPIO Bitmask=
 
=GPIO Bitmask=
The bitmask used by GetIRGPIO(and likely others) determines which bits in the GPIO registers to access. The output value from GetIRGPIO uses the same format as the bitmask: the values of bits in the output field are set to the value of GPIO data when those bits are set in the input bitmask.
+
The bitmask used by the service commands determines which bits in the GPIO registers to access. The output value from [[GPIO:GetGPIOData|GetGPIOData]] uses the same format as the bitmask: the values of bits in the output field are set to the value of GPIO data when those bits are set in the input bitmask.
  
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 90: Line 90:
 
!  Register
 
!  Register
 
!  Bits from register
 
!  Bits from register
 +
!  Handled with [[GPIO:SetGPIOData]]
 
|-
 
|-
 
| 0-2 (0x7)
 
| 0-2 (0x7)
 
| 0x10147000
 
| 0x10147000
 
| 0-2
 
| 0-2
 +
| No
 
|-
 
|-
 
| 3-4 (0x18)
 
| 3-4 (0x18)
 
| 0x10147010
 
| 0x10147010
 
| 0-1
 
| 0-1
 +
| Yes
 
|-
 
|-
 
| 5 (0x20)
 
| 5 (0x20)
 
| 0x10147014
 
| 0x10147014
 
| 0
 
| 0
 +
| Yes
 
|-
 
|-
 
| 6-17 (0x3FFC0)
 
| 6-17 (0x3FFC0)
 
| 0x10147020
 
| 0x10147020
 
| 0-11
 
| 0-11
 +
| Yes
 
|-
 
|-
 
| 18 (0x40000)
 
| 18 (0x40000)
 
| 0x10147028
 
| 0x10147028
 
| 0
 
| 0
 +
| Yes
 +
|}
 +
 +
==GPIO Bits==
 +
{| class="wikitable" border="1"
 +
|-
 +
!  Bit
 +
!  Bitmask
 +
!  Accessible via GPIO service
 +
!  Used by
 +
!  Description
 +
|-
 +
| 0
 +
| 0x1
 +
| gpio:HID
 +
| HID-sysmodule
 +
| Used with [[HID_Shared_Memory|HID]] PAD state.
 +
|-
 +
| 1
 +
| 0x2
 +
| None
 +
|
 +
| Not known to be used by ''anything'', with the latest system-version at least.
 +
|-
 +
| 2
 +
| 0x4
 +
| None
 +
|
 +
| Not known to be used by ''anything'', with the latest system-version at least.
 +
|-
 +
| 3
 +
| 0x8
 +
| gpio:CDC
 +
| ?
 +
| ?
 +
|-
 +
| 4
 +
| 0x10
 +
| None
 +
|
 +
| Not known to be used by ''anything'', with the latest system-version at least.
 +
|-
 +
| 5
 +
| 0x20
 +
| gpio:MCU, gpio:NWM
 +
| ?
 +
| ?
 +
|-
 +
| 6
 +
| 0x40
 +
| gpio:CDC, gpio:IR
 +
| ?
 +
| ?
 +
|-
 +
| 7
 +
| 0x80
 +
| gpio:IR
 +
| Boot11
 +
| ?
 +
|-
 +
| 8
 +
| 0x100
 +
| gpio:HID
 +
| HID sysmodule
 +
| Used with gyroscope
 +
|-
 +
| 9
 +
| 0x200
 +
| gpio:HID, gpio:IR
 +
| HID-sysmodule and IR-sysmodule
 +
| Unknown, used with ir:rst.
 +
|-
 +
| 10
 +
| 0x400
 +
| gpio:IR
 +
| IR-sysmodule, Boot11
 +
| IR [[IRU:SetIRLEDState|send]]. 1 = IR LED enable, 0 = IR LED disable.
 +
|-
 +
| 11
 +
| 0x800
 +
| gpio:IR
 +
| IR-sysmodule
 +
| IR [[IRU:GetIRLEDRecvState|receive]]
 +
|-
 +
| 12
 +
| 0x1000
 +
| gpio:NFC
 +
| ?
 +
| ?
 +
|-
 +
| 13
 +
| 0x2000
 +
| gpio:NFC
 +
| ?
 +
| ?
 +
|-
 +
| 14
 +
| 0x4000
 +
| gpio:HID
 +
| HID-sysmodule
 +
| Used with [[HID_Shared_Memory|HID]]  PAD state.
 +
|-
 +
| 15
 +
| 0x8000
 +
| gpio:MCU
 +
| ?
 +
| ?
 +
|-
 +
| 16
 +
| 0x10000
 +
| gpio:NFC
 +
| ?
 +
| ?
 +
|-
 +
| 17
 +
| 0x20000
 +
| gpio:QTM
 +
| ?
 +
| ?
 +
|-
 +
| 18
 +
| 0x40000
 +
| gpio:MCU, gpio:NWM
 +
| NWM-sysmodule
 +
| Wifi enable. 1=Enabled, 0=Disabled.
 
|}
 
|}

Latest revision as of 15:09, 4 May 2021

GPIO Service Names[edit]

Service name Permitted GPIO bitmasks
gpio:CDC 0x48
gpio:MCU 0x48020
gpio:HID 0x4301
gpio:NWM 0x40020
gpio:IR 0xEC0
gpio:NFC 0x13000
gpio:QTM 0x20000

For the mapping between GPIO bitmasks and IRQs see: GPIO:BindInterrupt#Supported_values.

The commands for these services are identical.

The input bitmask for each command is masked with the above permission bitmask, if the result is non-zero an error is occurred.

GPIO Services[edit]

Command Header Description Uses GPIO Regs
0x00010040 u32 GetRegPart1(u32 mask) 0x10147010, 0x10147020
0x00020080 void SetRegPart1(u32 value, u32 mask) 0x10147010, 0x10147020
0x00030040 u32 GetRegPart2(u32 mask) 0x10147010, 0x10147024
0x00040080 u32 SetRegPart2(u32 value, u32 mask) 0x10147010, 0x10147024
0x00050040 u32 GetInterruptMask(u32 mask) 0x10147010, 0x10147024
0x00060080 void SetInterruptMask(u32 value, u32 mask) 0x10147010, 0x10147024
0x00070040 GetGPIOData 0x10147000, 0x10147010, 0x10147014, 0x10147020, 0x10147028
0x00080080 SetGPIOData 0x10147010, 0x10147014, 0x10147020, 0x10147028
0x00090082 BindInterrupt None
0x000A0042 UnbindInterrupt None

GPIO Bitmask[edit]

The bitmask used by the service commands determines which bits in the GPIO registers to access. The output value from GetGPIOData uses the same format as the bitmask: the values of bits in the output field are set to the value of GPIO data when those bits are set in the input bitmask.

Bits in the bitmask Register Bits from register Handled with GPIO:SetGPIOData
0-2 (0x7) 0x10147000 0-2 No
3-4 (0x18) 0x10147010 0-1 Yes
5 (0x20) 0x10147014 0 Yes
6-17 (0x3FFC0) 0x10147020 0-11 Yes
18 (0x40000) 0x10147028 0 Yes

GPIO Bits[edit]

Bit Bitmask Accessible via GPIO service Used by Description
0 0x1 gpio:HID HID-sysmodule Used with HID PAD state.
1 0x2 None Not known to be used by anything, with the latest system-version at least.
2 0x4 None Not known to be used by anything, with the latest system-version at least.
3 0x8 gpio:CDC ? ?
4 0x10 None Not known to be used by anything, with the latest system-version at least.
5 0x20 gpio:MCU, gpio:NWM ? ?
6 0x40 gpio:CDC, gpio:IR ? ?
7 0x80 gpio:IR Boot11 ?
8 0x100 gpio:HID HID sysmodule Used with gyroscope
9 0x200 gpio:HID, gpio:IR HID-sysmodule and IR-sysmodule Unknown, used with ir:rst.
10 0x400 gpio:IR IR-sysmodule, Boot11 IR send. 1 = IR LED enable, 0 = IR LED disable.
11 0x800 gpio:IR IR-sysmodule IR receive
12 0x1000 gpio:NFC ? ?
13 0x2000 gpio:NFC ? ?
14 0x4000 gpio:HID HID-sysmodule Used with HID PAD state.
15 0x8000 gpio:MCU ? ?
16 0x10000 gpio:NFC ? ?
17 0x20000 gpio:QTM ? ?
18 0x40000 gpio:MCU, gpio:NWM NWM-sysmodule Wifi enable. 1=Enabled, 0=Disabled.