Configuração e Teste do Sensor dToF VI5301 no RK3566

O sensor VI5301, fabricado pela Evisionics, é um dispositivo de tempo de voo direto (dToF) compatível com o ST VL53L0x. Em testes práticos, apresentou precisão dentro de ±1mm.

Plataforma de Desenvolvimento

Sistema operacional: Linux 4.19 com Buildroot.

Processador: RK3566.

Migração do Driver

Após extrair os arquivos fornecidos pelo fabricante (VI5301_Linux_General_M40_V202), execute as seguintes etapas.

1. Cópia dos Arquivos do Driver

Copie a pasta vi530x para o diretório kernel/drivers/input/misc do SDK.

2. Adição do Dispositivo no DTS

No arquivo DTS, adicione um nó I2C para o dispositivo:

&i2c2 {
    sensor_vi: sensor_vi@6c {
        status = "okay";
        compatible = "evisionics,vi530x";
        reg = <0x6c>;
        xshut_pin = <&gpio4 RK_PA1 GPIO_ACTIVE_HIGH>;
        irq_pin = <&gpio4 RK_PA0 IRQ_TYPE_EDGE_FALLING>;
    };
};

3. Integração na Compilação

No arquivo Kconfig dentro do diretório misc, antes do endif, adicione:

source "drivers/input/misc/vi530x/Kconfig"

No arquivo Makefile correspondente, inclua no final:

obj-$(CONFIG_VI530X)        += vi530x/

No Makefile do vi530x, altere o conteúdo para:

#
# Makefile para drivers vi530x.
#
ccflags-y    += -Idrivers/misc/vi530x

obj-$(CONFIG_VI530X)    += vi530x.o
vi530x-y    += vi530x_core.o vi530x_io.o vi530x_sensor.o vi530x_flash.o

Compilação do Kernel

1. Configuração das Opções do Kernel

No diretório do kernel, execute:

make menuconfig ARCH=arm64

Na interface de configuração, selecione a opção para o dispositivo I2C VI530X. Salve a configuração e copie o arquivo .config:

cp .config arch/arm64/configs/rockchip_linux_defconfig

2. Construção do Kernel

Retorne ao diretório anterior e inicie a compilação:

./build.sh kernel

Carregamento do Driver

1. Atualização da Imagem do Kernel

Após compilação bem-sucedida, grave novamente o arquivo boot.img.

2. Transferência do Firmware

O VI5301 contém um MCU sem memória flash interna, necessitando que o firmware seja carregaod via I2C após a inicialização. Transfira o arquivo de firmware (VI5301-V40_Firmware_R03_V1.13.bin) para o diretório /lib/firmware/ ou /usr/lib/firmware/ no dispositivo alvo.

adb push VI5301-V40_Firmware_R03_V1.13.bin /lib/firmware

3. Verificação do Carregamento

O sensor está conectado ao barramento I2C2. Use o i2cdetect para verificação:

i2cdetect -y 2

Um endereço 0x6c com indicação "UU" confirma que o driver está carregado. Verifique a existência do dispositivo:

ls /dev/vi530x

4. Logs de Inicialização

Consulte os logs do kernel para detalhes:

dmesg | grep vi530x

Testes

1. Programa de Demonstração

O fornecedor inclui dois programas de teste: vi530x_general_ioctl.c e vi530x_general_sysfs.c. Utilizaremos a versão com ioctl. O programa inicia o sensor e lê distâncias 30 vezes com intervalo de 30ms.

    if (ioctl(sensor_desc, VI530X_IOCTL_START, NULL) < 0) {
        fprintf(stderr, "Erro ao iniciar sensor: %s\n", strerror(errno));
        goto encerrar;
    }
    for (int contador = 0; contador < 30; contador++) {
        usleep(30000);
        ioctl(sensor_desc, VI530X_IOCTL_MZ_DATA, &medida);
        fprintf(stderr, "Tempo:%d, Distancia:%d\n", medida.timestamp, medida.distancia_mm);
        snprintf(buffer_saida, sizeof(buffer_saida), "Tempo:%d, Distancia:%d\n", medida.timestamp, medida.distancia_mm);
        fwrite(buffer_saida, strlen(buffer_saida), 1, arquivo_saida);
    }
    if (ioctl(sensor_desc, VI530X_IOCTL_STOP, NULL) < 0) {
        fprintf(stderr, "Erro ao parar sensor: %s\n", strerror(errno));
        goto encerrar;
    }

2. Compilação do Programa de Teste

Desative a calibração XTALK e OFFSET usando compilação condicional. Certifique-se de incluir o cabeçalho <stdint.h>. Um Makefile simples pode ser usado:

CC = gcc
CFLAGS = -Wall -O2
LDFLAGS = -lpthread

alvo: teste_vi530x.c
    $(CC) $(CFLAGS) -o teste_vi530x teste_vi530x.c $(LDFLAGS)

clean:
    rm -f teste_vi530x

3. Transferência e Execução

Transfira o binário compilado para o dispositivo alvo e execute-o. Os resultados exibirão a distância em milímetros (campo distancia_mm).

adb push teste_vi530x /usr/
chmod 755 /usr/teste_vi530x
/usr/teste_vi530x

Calibração

Se houver uma cobertura de vidro acima do sensor, realize a calibração XTALK e OFFSET para precisão adequada. Os parâmetros calibrados são salvos automaticamente em um arquivo de configuração.

Problemas Encontrados

Em operações anormais, o sensor pode travar com o erro "CPU Busy", não sendo recuperado sem reinicialização física do sistema. O código de inicialização verifica o estado do processador interno:

VI530X_Erro inicializar_sensor(VI530X_Dispositivo dev) {
    VI530X_Erro status = VI530X_ERRO_NENHUM;
    status = esperar_cpu_pronta(dev);
    if (status != VI530X_ERRO_NENHUM) {
        log_erro("CPU interna ocupada!");
        // Código original retornava erro aqui
    }
    // Restante da inicialização...
}

Uma solução temporária é ignorar o erro na verificação da CPU, permitindo que a inicialização prossiga:

if (status != VI530X_ERRO_NENHUM) {
    log_erro("CPU ocupada - prosseguindo...");
    // Ignorar erro e continuar
}

Tags: RK3566 VI5301 dToF driver Linux I2C

Publicado em 6-13 18:43 por Thomas