2025-05-21 11:31:07 +08:00

112 lines
2.9 KiB
C

/*
* bsp_TFT.c
*
* Created on: 2025年4月9日
* Author: 22332
*/
#include "cola_init.h"
#include "cola_device.h"
#include "drv_master_iic.h"
#include "bsp_register_map.h"
#include <stdio.h>
#include <stdlib.h>
#define I2C_TX_BUFFER_LENGTH (5U)
#define I2C_RX_BUFFER_LENGTH (5U)
static cola_device_t g_tft_iic;
static uint8_t slave_address = RM5T500A_Slave_Address;
uint32_t merge_four_bytes(uint8_t byte1, uint8_t byte2, uint8_t byte3, uint8_t byte4)
{
return (byte1 << 24) | (byte2 << 16) | (byte3 << 8) | byte4;
}
// 记录合并后数据中1的位置
int* record_one_positions(uint32_t merged_data, int* size)
{
int max_positions = 32; // 32位数据中最多有32个1
int* positions = (int*)malloc(max_positions * sizeof(int));
if (positions == NULL) {
fprintf(stderr, "内存分配失败\n");
return NULL;
}
*size = 0; // 初始化记录位置的数组大小
for (int i = 0; i < 32; i++) {
if (merged_data & (1 << i)) {
positions[*size] = i;
(*size)++;
}
}
return positions;
}
static int bsp_iic_tft_read(cola_device_t *dev, int pos,void *buffer, int size)
{
bool bACK = false;
#if 0
uint8_t *transmitBuffer = (uint8_t *)buffer;
// 从I2C总线接收数据
bsp_ctrl_read_polling(slave_address,transmitBuffer, size);
// 将接收到的数据合并到一块并检查错误位置
uint32_t merged_data = merge_four_bytes(transmitBuffer[0],transmitBuffer[1], transmitBuffer[2], transmitBuffer[3]);
int Size;
int* positions = record_one_positions(merged_data, &Size);
buffer = positions;
if (positions != NULL)
{
printf("Positions of is: ");
for (int i = 0; i < Size; i++)
{
printf("%d ", positions[i]);
}
printf("\n");
free(positions); // 释放分配的内存
}
return 0;
#else
int bEnPairRead = (pos > 0xFF)?true:false;
if(bEnPairRead)
bACK = bsp_ctrl_read_pair_register(slave_address,pos&0xFFFF,buffer,size);
else
bACK = bsp_ctrl_read_register(slave_address,pos&0xFF,buffer,size);
return bACK;
#endif
}
static int bsp_iic_tft_write(cola_device_t *dev, int pos, const void *buffer, int size)
{
//uint8_t *transmitBuffer = (uint8_t *)buffer;
// bsp_ctrl_wirte_polling(slave_address, transmitBuffer, size);
uint8_t *data = (uint8_t *)buffer;
uint8_t buf[8];
if(size > 7)
size = 7;
buf[0] = (uint8_t)pos;
for(int i=0; i<size; i++)
buf[1+i] = (uint8_t)data[i];
return bsp_ctrl_write_register(slave_address,buf,1+size);
}
static struct cola_device_ops tft_iic_Ops =
{
.read = bsp_iic_tft_read,
.write = bsp_iic_tft_write,
};
static void bsp_tft_iic_configuration(void)
{
g_tft_iic.name = "TFT_IIC";
g_tft_iic.dops = &tft_iic_Ops;
cola_device_register(&g_tft_iic);
}
register_initcall(bsp_tft_iic_configuration);