Difference between revisions of "SceSystimer"

From Vita Development Wiki
Jump to navigation Jump to search
m (Reword + add some RE by Bythos)
 
Line 23: Line 23:
 
== Types ==
 
== Types ==
 
<source lang="C">
 
<source lang="C">
#define SYSTIMER_TYPE_LONG 1
+
#define SYSTIMER_TYPE_LONG 1     //<! 64-bit timer
#define SYSTIMER_TYPE_WORD 2
+
#define SYSTIMER_TYPE_WORD 2     //<! 32-bit timer
 
typedef SceInt32 SceSystimerType;
 
typedef SceInt32 SceSystimerType;
 +
 +
#define SYSTIMER_CLKSRC_SYS  0  //<! The clock controlled by scePowerSetSysClockFrequency
 +
#define SYSTIMER_CLKSRC_48MHZ 3  //<! A clock running at a fixed frequency of 48MHz
 +
typedef SceUInt32 SceSystimerClkSrc;
  
 
typedef SceInt32 SceSystimerId;
 
typedef SceInt32 SceSystimerId;
Line 52: Line 56:
 
|}
 
|}
  
Edit some bits (mask 0xFFF00700) of the timer's config register. Timer must not be counting.
+
Set the timer's frequency. Timer must not be counting.
  
 
<source lang="C">
 
<source lang="C">
 +
//
 +
// Timer frequency = (clock source frequency) / (prescaleFactor + 1)
 +
//
 
// if (a2 < 0x10), written to bits 0x00F00000
 
// if (a2 < 0x10), written to bits 0x00F00000
 
// else (a2 & 0x7) written to bits 0x00000700 and 0x2 written to bits 0x00F00000
 
// else (a2 & 0x7) written to bits 0x00000700 and 0x2 written to bits 0x00F00000
 
// a3 written to bits 0xFF000000
 
// a3 written to bits 0xFF000000
SceInt32 SceSystimerForDriver_0450933B(SceSystimerId timer, SceUInt32 a2, SceUInt32 a3);
+
SceInt32 SceSystimerForDriver_0450933B(SceSystimerId timer, SceSystimerClkSrc src, SceUInt32 prescaleFactor);
 
</source>
 
</source>
  
Line 69: Line 76:
 
|}
 
|}
  
Sets the timer's current counter value?
+
Sets the timer's counter value and increments the accumulating counter by <code>counter</code>.
  
<source lang="C">SceInt32 SceSystimerForDriver_1B14DFD6(SceSystimerId timer, SceKernelSysClock a2);</source>
+
<source lang="C">SceInt32 SceSystimerForDriver_1B14DFD6(SceSystimerId timer, SceKernelSysClock counter);</source>
  
 
=== SceSystimerForDriver_59EBD22D ===
 
=== SceSystimerForDriver_59EBD22D ===
Line 81: Line 88:
 
|}
 
|}
  
Start timer.
+
Starts the timer.
  
 
<source lang="C">SceInt32 SceSystimerForDriver_59EBD22D(SceSystimerId timer);</source>
 
<source lang="C">SceInt32 SceSystimerForDriver_59EBD22D(SceSystimerId timer);</source>
Line 93: Line 100:
 
|}
 
|}
  
Reset timer? Sets current counter and accumulated counter to 0.
+
Resets the timer. Sets current and accumulated counter to 0.
  
 
<source lang="C">SceInt32 SceSystimerForDriver_7DEBA6A5(SceSystimerId timer);</source>
 
<source lang="C">SceInt32 SceSystimerForDriver_7DEBA6A5(SceSystimerId timer);</source>
Line 105: Line 112:
 
|}
 
|}
  
<code>sceKernelSysTimerFree</code>? Stops timer if necessary.
+
Stops the timer if active, and frees the timer. (<code>sceKernelSysTimerFree</code>)
  
 
<source lang="C">SceInt32 SceSystimerForDriver_8358611F(SceSystimerId timer);</source>
 
<source lang="C">SceInt32 SceSystimerForDriver_8358611F(SceSystimerId timer);</source>
Line 117: Line 124:
 
|}
 
|}
  
Get timer accumulated time (i.e. <code>*a2 = timer->currentCounter + (sum of counter of each time interrupt was triggered)</code>)
+
Obtains the timer's accumulated count (i.e. <code>*a2 = timer->currentCounter + (sum of counter of each time interrupt was triggered)</code>)
  
 
<source lang="C">SceInt32 SceSystimerForDriver_85AAE0DD(SceSystimerId timer, SceKernelSysClock* a2);</source>
 
<source lang="C">SceInt32 SceSystimerForDriver_85AAE0DD(SceSystimerId timer, SceKernelSysClock* a2);</source>
Line 146: Line 153:
 
|}
 
|}
  
Get timer counter (i.e. <code>*a2 = timer->currentCount</code>).
+
Obtains the current value of the timer's counter (i.e. <code>*a2 = timer->currentCount</code>).
  
 
<source lang="C">SceInt32 SceSystimerForDriver_963F7C0D(SceSystimerId timer, SceKernelSysClock* a2);</source>
 
<source lang="C">SceInt32 SceSystimerForDriver_963F7C0D(SceSystimerId timer, SceKernelSysClock* a2);</source>
Line 158: Line 165:
 
|}
 
|}
  
Set timer threshold? Timer must not be counting.
+
Sets the timer's threshold. Timer must not be counting.
  
 
<source lang="C">SceInt32 SceSystimerForDriver_A73351C1(SceSystimerId timer, SceKernelSysClock a2);</source>
 
<source lang="C">SceInt32 SceSystimerForDriver_A73351C1(SceSystimerId timer, SceKernelSysClock a2);</source>
Line 170: Line 177:
 
|}
 
|}
  
Stop timer.
+
Stops the timer.
  
 
<source lang="C">SceInt32 SceSystimerForDriver_BF8D42B0(SceSystimerId timer);</source>
 
<source lang="C">SceInt32 SceSystimerForDriver_BF8D42B0(SceSystimerId timer);</source>
Line 198: Line 205:
 
|}
 
|}
  
Set behaviour on interrupt.
+
(Un)registers an interrupt handler for the timer.
  
 
<source lang="C">
 
<source lang="C">
 
/*
 
/*
  * cb will be invoked whenever the timer is interrupted - timer and pUserData arguments will be the same as provided to this function
+
  * cb will be invoked whenever the timer generates an interrupt (that is, when the counter reaches the threshold set via SceSystimerForDriver_A73351C1())
 +
* timer and pUserData arguments will be the same as provided to this function
 
  * cb will only be called if SceSystimerForDriver_A73351C1() has been called with non-zero argument (e.g. timer has a threshold)
 
  * cb will only be called if SceSystimerForDriver_A73351C1() has been called with non-zero argument (e.g. timer has a threshold)
 
  * cb can be NULL, in which case targetCPU will not be set
 
  * cb can be NULL, in which case targetCPU will not be set
Line 219: Line 227:
 
|}
 
|}
  
Read some ?counter? from the timer.
+
Reads some ?counter? from the timer.
  
 
<source lang="C">SceInt32 SceSystimerForDriver_FD5F1742(SceSystimerId timer, SceKernelSysClock* a2);</source>
 
<source lang="C">SceInt32 SceSystimerForDriver_FD5F1742(SceSystimerId timer, SceKernelSysClock* a2);</source>

Latest revision as of 18:04, 11 August 2023

Manages the system timers. This module wraps the Hardware Timers and add some functionalities, along with providing a consistent interface.

Module

Version World Privilege
0.931-3.65 Non-secure Kernel

Libraries

Known NIDs

Version Name World Visibility NID
0.931-3.65 SceSystimerForDriver Non-secure Kernel 0xA47EB09A

Types

#define SYSTIMER_TYPE_LONG 1      //<! 64-bit timer
#define SYSTIMER_TYPE_WORD 2      //<! 32-bit timer
typedef SceInt32 SceSystimerType;

#define SYSTIMER_CLKSRC_SYS   0   //<! The clock controlled by scePowerSetSysClockFrequency
#define SYSTIMER_CLKSRC_48MHZ 3   //<! A clock running at a fixed frequency of 48MHz
typedef SceUInt32 SceSystimerClkSrc;

typedef SceInt32 SceSystimerId;

typedef void (*SceSystimerCallback)(SceSystimerId timer, void* pUserData);

SceSystimerForDriver

sceKernelSysTimerAllocForDriver

Version NID
0.990-3.60 0xE2B9D8E9
SceSystimerId sceKernelSysTimerAllocForDriver(SceSystimerType type);

SceSystimerForDriver_0450933B

Version NID
3.65 0x0450933B

Set the timer's frequency. Timer must not be counting.

//
// Timer frequency = (clock source frequency) / (prescaleFactor + 1)
//
// if (a2 < 0x10), written to bits 0x00F00000
// else (a2 & 0x7) written to bits 0x00000700 and 0x2 written to bits 0x00F00000
// a3 written to bits 0xFF000000
SceInt32 SceSystimerForDriver_0450933B(SceSystimerId timer, SceSystimerClkSrc src, SceUInt32 prescaleFactor);

SceSystimerForDriver_1B14DFD6

Version NID
3.65 0x1B14DFD6

Sets the timer's counter value and increments the accumulating counter by counter.

SceInt32 SceSystimerForDriver_1B14DFD6(SceSystimerId timer, SceKernelSysClock counter);

SceSystimerForDriver_59EBD22D

Version NID
3.65 0x59EBD22D

Starts the timer.

SceInt32 SceSystimerForDriver_59EBD22D(SceSystimerId timer);

SceSystimerForDriver_7DEBA6A5

Version NID
3.65 0x7DEBA6A5

Resets the timer. Sets current and accumulated counter to 0.

SceInt32 SceSystimerForDriver_7DEBA6A5(SceSystimerId timer);

SceSystimerForDriver_8358611F

Version NID
3.65 0x8358611F

Stops the timer if active, and frees the timer. (sceKernelSysTimerFree)

SceInt32 SceSystimerForDriver_8358611F(SceSystimerId timer);

SceSystimerForDriver_85AAE0DD

Version NID
3.65 0x85AAE0DD

Obtains the timer's accumulated count (i.e. *a2 = timer->currentCounter + (sum of counter of each time interrupt was triggered))

SceInt32 SceSystimerForDriver_85AAE0DD(SceSystimerId timer, SceKernelSysClock* a2);

SceSystimerForDriver_904DF737

Version NID
3.65 0x904DF737

Edits some bits (mask 0x000F0080) of the timer's config register. Timer must not be counting.

// a2 written to bits 0x000F0000
// a3 written to bit  0x00000080
// additionaly, config register is also |= 0x40
SceInt32 SceSystimerForDriver_904DF737(SceSystimerId timer, SceUInt32 a2, SceBool a3);

SceSystimerForDriver_963F7C0D

Version NID
3.65 0x963F7C0D

Obtains the current value of the timer's counter (i.e. *a2 = timer->currentCount).

SceInt32 SceSystimerForDriver_963F7C0D(SceSystimerId timer, SceKernelSysClock* a2);

SceSystimerForDriver_A73351C1

Version NID
3.65 0xA73351C1

Sets the timer's threshold. Timer must not be counting.

SceInt32 SceSystimerForDriver_A73351C1(SceSystimerId timer, SceKernelSysClock a2);

SceSystimerForDriver_BF8D42B0

Version NID
3.65 0xBF8D42B0

Stops the timer.

SceInt32 SceSystimerForDriver_BF8D42B0(SceSystimerId timer);

SceSystimerForDriver_C34D7940

Version NID
3.65 0xC34D7940

Edits some bits (mask 0x0000F000) of the timer's config register. Timer must not be counting.

// a2 written to bits 0x0000F000
// additionaly, config register is also |= 0x20
SceInt32 SceSystimerForDriver_C34D7940(SceSystimerId timer, SceUInt32 a2);

SceSystimerForDriver_CCCD1EE3

Version NID
3.65 0xCCCD1EE3

(Un)registers an interrupt handler for the timer.

/*
 * cb will be invoked whenever the timer generates an interrupt (that is, when the counter reaches the threshold set via SceSystimerForDriver_A73351C1())
 * timer and pUserData arguments will be the same as provided to this function
 * cb will only be called if SceSystimerForDriver_A73351C1() has been called with non-zero argument (e.g. timer has a threshold)
 * cb can be NULL, in which case targetCPU will not be set
 *
 * targetCPU follows the same rules as sceKernelSetIntrTarget() - see SceKernelIntrMgr for more info
 */
SceInt32 SceSystimerForDriver_CCCD1EE3(SceSystimerId timer, SceSystimerCallback cb, SceUInt32 targetCPU, void* pUserData);

SceSystimerForDriver_FD5F1742

Version NID
3.65 0xFD5F1742

Reads some ?counter? from the timer.

SceInt32 SceSystimerForDriver_FD5F1742(SceSystimerId timer, SceKernelSysClock* a2);