Tutorial do MILK-V DUO
Seção 1: Tutorial de gravação da Imagem do MILV-V Duo
Uma vez com a imagem em mãos, abra o Win32DiskImager software, selecione o arquivo de imagem, escolha o dispositivo e clique em "Gravar".
Após a bem sucedida escrita, a unidade USB pode ser ejetado.
Insira o cartão SD no slot da placa de desenvolviemnto MILK-V DUO, a alimentação é através de USB 5V, aguarde cerca de 5 segundos, e o indicador azul do sistema executando começará a piscar, indicando que o sistema está funcionando normalmente.
Seção 2: MILK-V Duo USB (RNDIS) - Acesso ao Terminal
Seção 3: Login do MILK-V pela UART Serial
<---> | ||
<---> | ||
<---> | ||
<---> |
115200 | |
8 | |
1 | |
nenhum |
Atenção! Se você tentar usar o login serial enquanto a placa de desenvolvimento estiver ligada, é provável que o software de login do console permaneça em um estado bloqueado. Recomenda-se primeiro usar o software de acesso remoto para estabelecer um login serial (que inicialmente entrará em um estado bloqueado) enquanto a placa de desenvolvimento está completamente desligada (ou seja, tanto a alimentação da placa de desenvolvimento Duo quanto a conexão USB para TTL com os pinos da placa de desenvolvimento Duo são desconectadas).
Em seguida, ligue a placa de desenvolvimento Duo e, posteriormente, conecte o dispositivo USB ao TTL aos pinos TXD, RXD e GND na placa de desenvolvimento Duo para habilitar a funcionalidade de login serial. Em seguida, ligue a placa de desenvolvimento Duo e, posteriormente, conecte o dispositivo USB ao TTL aos pinos TXD, RXD e GND na placa de desenvolvimento Duo para habilitar a funcionalidade de login serial.
Atenção! Ao usar o login serial, você deve ligar a placa de desenvolvimento DUO antes de conectar o dispositivo USB ao TTL, pois o pino TXD do dispositivo USB para TTL carrega sinais elétricos. Se você conectar os pinos seriais primeiro e, em seguida, ligar a placa de desenvolvimento DUO, o nível de tensão no pino TXD pode fazer com que o chip opere em baixa tensão, o que pode levar a um tempo errático na interface serial do chip, impedindo o uso normal do dispositivo USB para TTL e causando o acesso remoto
Seção 4: A Compilação Do Kernel
https://milk-v.blogspot.com/2024/06/gerando-img-para-os-modulo-milk-v-o-sdk_1.html
Seção 5: Controle de e/s e Iluminando os LEDS no MILK-V Duo (CV1800B, C906 Kernel):
Tutorial de Controle de LED com GPIO no MILK-V
Os módulos relacionados ao GPIO já estão embutidos no kernel, portanto, não há necessidade de executar comandos de carregamento.
Você pode executar operações de entrada e saída no GPIO executando comandos de leitura/gravação GPIO no console ou escrevendo programas de leitura/gravação GPIO no modo kernel ou modo de usuário.
O número do grupo XGPIOC é 416, portanto, o número GPIO é 416+24=440.
bashCopy codeecho 440 > /sys/class/gpio/export # This creates the /sys/class/gpio/gpio440 directory
echo out > /sys/class/gpio/gpio440/direction # Configure the IO direction as output:
echo 1 > /sys/class/gpio/gpio440/value # Illuminate the LED
echo 0 > /sys/class/gpio/gpio440/value # Turn off the LED
echo 440 > /sys/class/gpio/unexport # Release GPIO resources
#!/bin/bash
LED=440
# Activate GPIO-LED
echo $LED > /sys/class/gpio/export
# Set GPIO-LED
echo out > /sys/class/gpio/gpio$LED/direction
# Loop 10 times: Turn on LED, delay for 1 second, turn off LED, delay for 1 second
for i in $(seq 1 30)
do
echo 1 > /sys/class/gpio/gpio$LED/value
sleep 0.4
echo 0 > /sys/class/gpio/gpio$LED/value
sleep 0.4
done
# Cleanup GPIO
echo $LED > /sys/class/gpio/unexport
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <string.h>
// GPIO Pin Definitions
#define SYSFS_GPIO_EXPORT "/sys/class/gpio/export"
#define SYSFS_GPIO_UNEXPORT "/sys/class/gpio/unexport"
#define SYSFS_GPIO_RST_PIN_VAL "440"
#define SYSFS_GPIO_RST_DIR "/sys/class/gpio/gpio440/direction"
#define SYSFS_GPIO_RST_DIR_VAL "out"
#define SYSFS_GPIO_RST_VAL "/sys/class/gpio/gpio440/value"
#define SYSFS_GPIO_RST_VAL_H "1"
#define SYSFS_GPIO_RST_VAL_L "0"
int main()
{
int fd;
int count = 30;
// Open the GPIO port: /sys/class/gpio# echo 440 > export
fd = open(SYSFS_GPIO_EXPORT, O_WRONLY);
if (fd == -1)
{
printf("Error: Failed to open export.\n");
return EXIT_FAILURE;
}
write(fd, SYSFS_GPIO_RST_PIN_VAL, sizeof(SYSFS_GPIO_RST_PIN_VAL));
close(fd);
// Set the GPIO pin direction: /sys/class/gpio/gpio440# echo out > direction
fd = open(SYSFS_GPIO_RST_DIR, O_WRONLY);
if (fd == -1)
{
printf("Error: Failed to open direction.\n");
return EXIT_FAILURE;
}
write(fd, SYSFS_GPIO_RST_DIR_VAL, sizeof(SYSFS_GPIO_RST_DIR_VAL));
close(fd);
// Output reset signal: Pull high >100ns
fd = open(SYSFS_GPIO_RST_VAL, O_RDWR);
if (fd == -1)
{
printf("Error: Failed to open GPIO.\n");
return EXIT_FAILURE;
}
while (count)
{
count--;
write(fd, SYSFS_GPIO_RST_VAL_H, sizeof(SYSFS_GPIO_RST_VAL_H));
usleep(1000000);
write(fd, SYSFS_GPIO_RST_VAL_L, sizeof(SYSFS_GPIO_RST_VAL_L));
usleep(1000000);
}
close(fd);
// Close the GPIO port: /sys/class/gpio# echo 440 > unexport
fd = open(SYSFS_GPIO_UNEXPORT, O_WRONLY);
if (fd == -1)
{
printf("Error: Failed to open unexport.\n");
return EXIT_FAILURE;
}
write(fd, SYSFS_GPIO_RST_PIN_VAL, sizeof(SYSFS_GPIO_RST_PIN_VAL));
close(fd);
return 0;
}
sudo find / -name "riscv64-unknown-linux-musl-gcc"
led_blink
sudo /home/jw/duo/cvi_mmf_sdk/host-tools/gcc/riscv64-linux-musl-x86_64/bin/riscv64-unknown-linux-musl-gcc -static -o led_blink led_blink.c
led_blink
sudo scp ./led_blink root@192.168.42.1:/root/
led_blink
mv /mnt/system/blink.sh /mnt/system/blink.sh_backup && sync
reboot
.py
vi ./test_led.py
# Experiment: Control the on-board LED on the UNIHIKER board to blink once every second.
# Wiring: Connect a UNIHIKER main control board to a computer.
import time
from pinpong.board import Board, Pin
Board("MILKV-DUO").begin() # Initialization, select the board type. If not specified, automatic recognition is performed.
led = Pin(Pin.D0, Pin.OUT) # Initialize the pin as a digital output
while True:
led.value(1) # Set the output to high (LED ON)
print("1") # Print a message to the terminal
time.sleep(0.5) # Wait for 0.5 seconds to maintain the state
led.value(0) # Set the output to low (LED OFF)
print("0") # Print a message to the terminal
time.sleep(0.5) # Wait for 0.5 seconds to maintain the state
bashCopy code
python3 ./test_led.py
Seção 6: Usar a Porta Ethernet RJ45:
ifconfig eth0 (Set your own IP address) netmask (Subnet mask)
route add default gw (Your route IP)
O intervalo de endereços IP estáticos da placa de desenvolvimento deve corresponder ao do roteador. Por exemplo, se o IP do roteador for 192.168.0.1, altere apenas o último dígito de 1 para 2-255 (cuidado para não entrar em conflito com outros IPs de dispositivo).
Se não houver mensagens de erro após a configuração, isso significa que a configuração foi bem-sucedida.
(Nota: Depois de configurar o IP estático, a lista de usuários do roteador pode não mostrar necessariamente o novo dispositivo. Para verificar o êxito da configuração, usando um cliente SSH para efetuar login i
Seção 7: Utilizando a Câmera:
scp duo_camera_test_v0.2.tar.gz root@192.168.42.1:/root/
ssh root@192.168.42.1
tar zxf duo_camera_test_v0.2.tar.gz -C /
cd /mnt/data/install/
./CviIspTool.sh 64M
VPSS init with src (1920, 1080) dst (1920, 1080).
CVI_VPSS_CreateGrp:0, s32Ret=0
rtsp://127.0.1.1:8554/stream0
prio:0
CVI_RTSP_SERVICE_CreateFromJsonFile[./cfg_64M.json]
[REMOTE] cvi_raw_dump_run,158: raw dump ready...
waiting for connect...
rtsp://192.168.42.1:8554/stream0
Seção 8:Ativar A Memória Virtual:
Expansão da Capacidade de Memória:
Permitindo Simultâneas de Execução do Programa:
Proporcionar um Maior Espaço de Endereço:
Melhor Gerenciamento de Memória:
mkswap /dev/mmcblk0p3
swapon /dev/mmcblk0p3
free -h