Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
triazo
/
kernel
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
3
Merge Requests
0
Wiki
Settings
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
46c608f0
authored
Oct 13, 2015
by
malcolm
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Preliminary PIT added, needs IDT install
parent
fd304617
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
122 additions
and
0 deletions
src/pit.c
src/pit.h
src/pit.c
0 → 100644
View file @
46c608f0
#include "pit.h"
#include "pic.h"
static
volatile
uint32_t
_pit_ticks
=
0
;
static
bool
_pit_is_init
=
false
;
void
pit_irq
()
{
asm
volatile
(
"add %esp, 12; pushad"
);
_pit_ticks
++
;
//TODO: NEED TO SEND DONE MESSAGE BACK
asm
volatile
(
"popad; iretd"
);
}
void
pit_command
(
uint8_t
cmd
)
{
outb
(
PIC_REG_COMD
,
cmd
);
}
void
pit_write
(
uint16_t
data
,
uint8_t
counter
)
{
uint16_t
port
=
(
counter
==
PIT_OCW_CONT_0
)
?
PIT_REG_CONT_0
:
((
counter
==
PIT_OCW_CONT_1
)
?
PIT_REG_CONT_1
:
PIT_REG_CONT_2
);
outb
(
port
,
(
uint8_t
)
data
);
}
uint8_t
pit_read
(
uint16_t
counter
)
{
uint16_t
port
=
(
counter
==
PIT_OCW_CONT_0
)
?
PIT_REG_CONT_0
:
((
counter
==
PIT_OCW_CONT_1
)
?
PIT_REG_CONT_1
:
PIT_REG_CONT_2
);
return
inb
(
port
);
}
uint32_t
pit_set_tick
(
uint32_t
i
)
{
uint32_t
ret
=
_pit_ticks
;
_pit_ticks
=
i
;
return
ret
;
}
uint32_t
pit_get_tick
()
{
return
_pit_ticks
;
}
void
pit_start_counter
(
uint32_t
frequency
,
uint8_t
counter
,
uint8_t
mode
)
{
if
(
freq
==
0
)
{
return
;
}
uint16_t
div
=
(
uint16_t
)(
1193181
/
(
uint16_t
)
freq
);
uint8_t
ocw
=
0
;
ocw
=
(
ocw
&
~
PIT_OCW_MODE
)
|
mode
;
ocw
=
(
ocw
&
~
PIT_OCW_RL
)
|
PIT_OCW_RL_DATA
;
ocw
=
(
ocw
&
~
PIT_OCW_CONT
)
|
counter
;
pit_command
(
ocw
);
pit_write
(
div
&
0xFF
,
0
);
pit_write
((
div
>>
8
)
&
0xFF
,
0
);
_pit_ticks
=
0
;
}
void
pit_init
();
{
//TODO: NEED TO SET INT 32 TO PIT IRQ HANDLER
_pit_is_init
=
true
;
}
bool
pit_is_init
()
{
return
_pit_is_init
;
}
src/pit.h
0 → 100644
View file @
46c608f0
#ifndef _PIT_INC
#define _PIT_INC
#include <stdint.h>
//OCW masks
#define PIT_OCW_BINC 0x01
#define PIT_OCW_MODE 0x0E
#define PIT_OCW_RL 0x30
#define PIT_OCW_CONT 0xC0
//OCW control bits
#define PIT_OCW_BINC_BIN 0x0
#define PIT_OCW_BINC_BCD 0x1
#define PIT_OCW_MODE_TERMCNT 0x0
#define PIT_OCW_MODE_ONESHOT 0x2
#define PIT_OCW_MODE_RATEGEN 0x4
#define PIT_OCW_MODE_SQWVGEN 0x6
#define PIT_OCW_MODE_SOFTTRG 0x8
#define PIT_OCW_MODE_HARDTRG 0xA
#define PIT_OCW_RL_LATH 0x00
#define PIT_OCW_RL_LSB 0x10
#define PIT_OCW_RL_MSB 0x20
#define PIT_OCW_RL_DATA 0x30
#define PIT_OCW_CONT_0 0x00
#define PIT_OCW_CONT_1 0x40
#define PIT_OCW_CONT_2 0x80
#define PIT_REG_CONT_0 0x40
#define PIT_REG_CONT_1 0x41
#define PIT_REG_CONT_2 0x42
#define PIT_REG_COMD 0x43
void
pit_command
(
uint8_t
cmd
);
void
pit_write
(
uint16_t
data
,
uint8_t
counter
);
uint8_t
pit_read
(
uint16_t
counter
);
uint32_t
pit_set_tick
(
uint32_t
i
);
uint32_t
pit_get_tick
();
void
pit_start_counter
(
uint32_t
frequency
,
uint8_t
counter
,
uint8_t
mode
);
void
pit_init
();
bool
pit_is_init
();
#endif
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment