Skip to content

Commit

Permalink
IIC驱动,增加初始化
Browse files Browse the repository at this point in the history
  • Loading branch information
VinbeWan committed Dec 8, 2024
1 parent 5a53acc commit 016d04c
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 28 deletions.
2 changes: 2 additions & 0 deletions src/core/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include "hda.h"
#include "vsound.h"
#include "shell.h"
#include "iic_core.h"

extern void* program_break_end;

Expand Down Expand Up @@ -92,6 +93,7 @@ _Noreturn void kernel_main(multiboot_t *multiboot, uint32_t kernel_stack) {
ahci_init();
hda_init();
hda_regist();
iic_init();

devfs_regist();

Expand Down
19 changes: 0 additions & 19 deletions src/driver/iic.c

This file was deleted.

52 changes: 52 additions & 0 deletions src/driver/iic_core.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#pragma once

#include "iic_core.h"

void iic_init(void) {
pci_device_t *IIC_Master_Controller = pci_find_class(0x0C800000);
if (IIC_Master_Controller == NULL) {
klogf(false, "Cannot find IIC Master Controller.\n");
return;
} else {
klogf(true, "Find IIC Master Controller.\n");
}
}

bool crc_check(IIC_Data *frame) {

uint32_t *data = frame->data;
uint8_t crc = crc8(data, frame->data_len);
if (crc != frame->crc) {
printk("CRC error!\n");
return false;
}else{
return true;
}
}

uint32_t iic_data_transfer(IIC_Data *frame) {

if (crc_check(frame)) {
// 将原始数据转换为32位值
uint32_t original_data = 0;
for (uint8_t i = 0; i < frame->data_len; i++) {
original_data |= (uint32_t)
data[i] << (8 * i);
}
return original_data;
}
}
void iic_start(pci_device_t *IIC_Device) {
// IIC主机控制器基地址发送起始信号
base_address_register iic_bar = find_bar(IIC_Device, 0);
uint32_t base_address = (uint32_t)(iic_bar.address);
io_out8(base_address + 0x10, 0x01);
}
void iic_stop(pci_device_t *IIC_Device) {
// IIC主机控制器基地址发送停止信号
base_address_register iic_bar = find_bar(IIC_Device, 0);
uint32_t base_address = (uint32_t)(iic_bar.address);
io_out8(base_address + 0x14, 0x00);
}


4 changes: 1 addition & 3 deletions src/include/crc.h
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
#ifndef COOLPOTOS_CRC_H
#define COOLPOTOS_CRC_H
#pragma once

#include "ctypes.h"

uint8_t crc8(uint32_t *data, uint8_t len);

#endif //COOLPOTOS_CRC_H
19 changes: 13 additions & 6 deletions src/include/iic.h → src/include/iic_core.h
Original file line number Diff line number Diff line change
@@ -1,16 +1,21 @@
#ifndef COOLPOTOS_IIC_H
#define COOLPOTOS_IIC_H
#pragma once

#include "ctypes.h"

#include "list.h"
#include "io.h"
#include "crc.h"
#include "klog.h"
#include "pci.h"

typedef struct {
uint32_t address; // 地址
uint8_t reg_address; // 寄存器首地址
uint32_t freq; // 频率
void (*init)(void); // 设备初始化函数
uint8_t flag; // 状态
void (*init)(void); // 设备初始化
void (*probe)(void); // 挂载设备
void (*remove)(void); // 卸载设备
} IIC_Device;
typedef struct {
uint8_t rw_flag; // 读写标志(0x00:写,0x01:读)
Expand All @@ -23,6 +28,8 @@ typedef struct {
uint8_t stop; // 数据段末标(0x01)
} IIC_Data;

int crc_check(IIC_Data *frame);

#endif //COOLPOTOS_IIC_H
void iic_init(void);
bool crc_check(IIC_Data *frame);
uint32_t iic_data_transfer(IIC_Data *frame);
void iic_start(pci_device_t *IIC_Device);
void iic_stop(pci_device_t *IIC_Device);

0 comments on commit 016d04c

Please sign in to comment.