| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- #include "timer.h"
- #include "../lib/kernel/io.h"
- #include "../lib/kernel/print.h"
- /**
- * 8253定时器初始化 计数器的工作频率均是 1.19318MHz
- * 通过控制字指定使用计数器 0,工作方式 2,
- * 然后写入初始值 1193180/ 中断信号的频率=计数器的初始值
- * 设置 中断信号的频率=100Hz
- */
- #define IRQ0_FREQUENCY 100
- #define INPUT_FREQUENCY 1193180
- #define COUNTER0_VALUE INPUT_FREQUENCY / IRQ0_FREQUENCY
- #define COUNTER0_PORT 0x40
- #define COUNTER0_NO 0
- #define COUNTER_MODE 2
- #define READ_WRITE_LATCH 3
- #define PIT_CONTROL_PORT 0x43
- /// @brief 设置计数器
- /// @param counter_port 操作的计数器端口
- /// @param counter_no 计数器编号
- /// @param rwl 读写锁属性
- /// @param counter_mode 模式
- /// @param counter_value 初始化值
- static void frequency_set(uint8_t counter_port, uint8_t counter_no, uint8_t rwl, uint8_t counter_mode, uint16_t counter_value)
- {
- // 先往控制字寄存器端口写入控制字
- outb(PIT_CONTROL_PORT, (uint8_t)(counter_no << 6 | rwl << 4 | counter_mode << 1));
- // 先写入计数器的低8位
- outb(counter_port, (uint8_t)counter_value);
- // 再写入计数器的高8位
- outb(counter_port, (uint8_t)counter_value >> 8);
- }
- /* 初始化 PIT 8235 */
- void timer_init(void)
- {
- put_str("timer_init start\n");
- // 设置计数器 0,工作方式 2,初始值 1193180/100=11931,即每 10ms 发送一次时钟中断
- frequency_set(COUNTER0_PORT, COUNTER0_NO, READ_WRITE_LATCH, COUNTER_MODE, COUNTER0_VALUE);
- put_str("timer_init done\n");
- }
|