IM31-P2-Display/DP1208/mcu_app/fml/fml_master_iic.c
2025-05-21 11:31:07 +08:00

215 lines
5.1 KiB
C

/*
* fml_master_iic.c
*
* Created on: 2025年4月7日
* Author: 22332
*/
#include <stdio.h>
#include "cola_init.h"
#include "cola_device.h"
#include "cola_os.h"
#include "fml_master_iic.h"
#include "shell.h"
#define TXBUFFER_LEN 8u
static task_t gmastiicTask;
static cola_device_t *g_pDevmaster = NULL;
uint8_t masterTxBuffer[TXBUFFER_LEN];
bool trans = true;
void fml_master_init(void)
{
g_pDevmaster = cola_device_find("MASTER_IIC");
if(g_pDevmaster)
cola_device_open(g_pDevmaster, 0);
for (int i = 0u; i < TXBUFFER_LEN; i++)
masterTxBuffer[i] = i;
}
int fml_master_iic_write(uint8_t devAddr,uint8_t *buf,int len)
{
int ret = 0;
cola_device_ctrl(g_pDevmaster, devAddr, NULL);
ret = cola_device_write(g_pDevmaster, 0x00, buf, len);
return ret;
}
int fml_master_iic_read(uint8_t devAddr,uint8_t reg,uint8_t *buf,int len)
{
int ret = 0;
cola_device_ctrl(g_pDevmaster, devAddr, NULL);
ret = cola_device_write(g_pDevmaster, 0x00, &reg, 1);
if(ret == 1)
ret = cola_device_read(g_pDevmaster, 0x00, buf, len);
return ret;
}
uint8_t fml_master_read_tft_page_reg(uint8_t page,uint8_t reg)
{
uint8_t pStartCmdSet[] = {0xC8,0x00,0x58,0xA8,0x18,0x01};
uint8_t pPageSel[] = {0x00,0x00,page};
uint8_t pPassWord[] = {0xFD,0x00,0xAA};
uint8_t pReg[] = {reg,0x00};
uint8_t readValue = 0x00;
cola_device_ctrl(g_pDevmaster, SLAVE_ADDR_TFT, NULL);
cola_device_write(g_pDevmaster,0,pStartCmdSet,sizeof(pStartCmdSet));
cola_device_write(g_pDevmaster,0,pPageSel,sizeof(pPageSel));
cola_device_write(g_pDevmaster,0,pPassWord,sizeof(pPassWord));
cola_device_write(g_pDevmaster,0,pReg,sizeof(pReg));
cola_device_ctrl(g_pDevmaster, SLAVE_ADDR_TFT, NULL);
cola_device_read(g_pDevmaster,0,&readValue,1);
return readValue;
}
static int string_to_number(const char *str) {
if (!str || *str == '\0') return -1;
long result = 0;
char *end_ptr;
int base = 10;
if (str[0] == '0' && tolower(str[1]) == 'x') {
base = 16;
}
result = strtol(str, &end_ptr, base);
return result;
}
int masteri2c(int argc, char *argv[]) {
if (argc < 4) {
logWrite("para length must greater than 3\r\n");
return 0;
}
int ret = 0;
int i = 0, len = argc - 3;
int address,slaveAddr=0x00;
uint8_t buf[SHELL_PARAMETER_MAX_NUMBER];
bool bEnableRead = false;
bool bEnableWrite = false;
char *pDevStrName = argv[1];
int mode = atoi(argv[2]);
cola_device_t *pDev = NULL;
//logWrite("argc=%d\r\n",argc);
memset(buf, sizeof(buf), 0);
if(strcmp(pDevStrName,"max25512") == 0)
{
slaveAddr = SLAVE_ADDR_MAX25512;
pDev = cola_device_find("max25512_IIC");
if(mode == 0)
bEnableRead = true;
else if(mode == 1)
bEnableWrite = true;
}
else if(strcmp(pDevStrName,"pmic") == 0)
{
slaveAddr = SLAVE_ADDR_PMIC;
pDev = cola_device_find("PMIC_IIC");
if(mode == 0)
bEnableRead = true;
else if(mode == 1)
bEnableWrite = true;
}
else if(strcmp(pDevStrName,"tft") == 0)
{
slaveAddr = SLAVE_ADDR_TFT;
pDev = cola_device_find("TFT_IIC");
if(mode == 0)
bEnableRead = true;
else if(mode == 1)
bEnableWrite = true;
}
else
{
//logWrite("not support\r\n");
extern uint8_t fml_tft_read_page_reg(uint8_t page,uint8_t reg);
uint8_t page = string_to_number(argv[2]);
uint8_t reg = string_to_number(argv[3]);
#if 0
logWrite("read = 0x%02X\r\n",fml_tft_read_page_reg(page,reg));
#else
logWrite("read = 0x%02X\r\n",fml_master_read_tft_page_reg(page,reg));
#endif
}
if(bEnableWrite)
{
for (i = 0; i < len; i++)
buf[i] = string_to_number(argv[3 + i]);
address = buf[0];
logWrite("Write[len=%d][addr=0x%02X]:",len,address);
for (i = 0; i < len; i++) {
logWrite("%02X ", buf[i]);
}
logWrite("\r\n");
#if 0
ret = cola_device_write(pDev, address, buf + 1, len - 1);
#else
ret = fml_master_iic_write(slaveAddr, buf, len);
#endif
if (ret == 0) {
logWrite("write err\r\n");
}
}
else if(bEnableRead)
{
address = string_to_number(argv[3]);
if(strcmp(pDevStrName,"tft") == 0 && (address > 0xFF))
{
address = string_to_number(argv[3]);
len = string_to_number(argv[4]);
logWrite("Read[len=%d][addr=0x%04X]:",len,address);
#if 0
ret = cola_device_read(pDev, address, buf, len);
#else
ret = fml_master_iic_read(slaveAddr, address, buf, len);
#endif
if (ret == 0) {
logWrite("read err\r\n");
}else{
for (i = 0; i < len; i++) {
logWrite("%02X ", buf[i]);
}
logWrite("\r\n");
}
}
else
{
address = string_to_number(argv[3]);
len = string_to_number(argv[4]);
if(len > SHELL_PARAMETER_MAX_NUMBER)
{
logWrite("Warn:len[%d] >SHELL_PARAMETER_MAX_NUMBER[%d],set len to %d\r\n",len,SHELL_PARAMETER_MAX_NUMBER,SHELL_PARAMETER_MAX_NUMBER);
len = SHELL_PARAMETER_MAX_NUMBER;
}
logWrite("Read[len=%d][addr=0x%02X]:",len,address);
#if 0
ret = cola_device_read(pDev, address, buf, len);
#else
ret = fml_master_iic_read(slaveAddr, address, buf, len);
#endif
if (ret == 0) {
logWrite("read err\r\n");
}else{
for (i = 0; i < len; i++) {
logWrite("%02X ", buf[i]);
}
logWrite("\r\n");
}
}
}
return 0;
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), masteri2c, masteri2c, masteri2c,masteri2c);