/**************************************
 *          iceOS Kernel              *
 * Developed by Marco 'icebit' Cetica * 
 *            (c) 2019                *
 *       Released under GPLv3         *
 * https://github.com/ice-bit/iceOS   *
 ***************************************/
#ifndef _TIMER_H_
#define _TIMER_H_

#include <stdint.h>
/*
 * The PIT(Programmable Interval Timer) is a chip that consist of an oscillator
 * It's connected to IRQ0 and it can be configure at a user-defined rate
 * between 10.Hz to 1.1931 MHz. The PIT is the primary method used to implement
 * a system clock and for implement multitasking.
 * The PIT's internal clock(~1.1931 MHz) is fed through a frequency divider that
 * modulate the final signal. This chip has 3 channel, each with his own
 * frequency divider:
 *  Channel 0: The most useful, it's output is connected to IRQ0
 *  Channel 1: It were used to control refresh rates on DRAM(RAMs with capacitors)
 *  Channel 2: Controls the PC speakers.
 * 
 * In our case, we will use only channel 0.
 * So we have to set up PIT at a frequency 'f', so it interrupts us at regular
 * intervals. We'll set the frequency to 100Hz(once every 10 ms); to do this
 * we'll send the PIT a divisor that will be divided for it's input frequency.
 * E.g. -> divisor = 1193180 Hz(1.1931MHz) / 100 Hz
 * 
 * Apart of that, the PIT has 4 registers: 0x40-0x42(data ports) and 0x43(command port)
 */

void init_timer(uint32_t frequency);
uint32_t tick;
/* Since regs parameter(from timer_callback) will be unused
 * GCC(with -Werror flag) will dump an error, so we avoid this
 * using the following macro
 */
#define UNUSED_PAR(x) (void)(x)

#endif