Suporta codificação de vídeo H.264/H.265, até 2880×1620@20fps
Compatível com sensores CMOS de alta definição
Saída de frequência programável para relógio do sensor
Recursos abrangentes de ISP para otimização de imagem
Suporte parcial à biblioteca OpenCV com aceleração de hardware CV
Codec de áudio de 16 bits com funções de entrada e saída de microfone integradas
Configurações de rede flexíveis com 1 Ethernet PHY
CSI-2 (câmera serial MIPI)
Possui uma interface FPC de 16 pinos para entrada de câmera MIPI de 2 pistas
Opera sinais I2C, CLK e RST em um nível de tensão de 1,8 V
Ethernet
Milk-V Duo inclui chip CV1800B com PHY de 100 Mbps
PHY está ligado a uma almofada de solda de 5 pinos
Transformador externo e soquete RJ45 são necessários para uso Ethernet
USB
Compatível com USB 2.0, compatível com versões anteriores de USB 1.1
Suporta vários modos de velocidade, funcionalidade Host/Dispositivo e protocolos de transferência
Interfaces expansíveis via Hub USB (até 127 dispositivos)
Modo de economia de energia, suporta dispositivos HID
Funciona como dispositivo escravo USB com software configurável
USB Tipo C para acesso à mídia de armazenamento
Micro SD
SDIO0 é compatível com o protocolo Secure Digital Memory (SD 3.0)
Sem WiFi (mas Ethernet via USB)
não tem WiFi (use ESP8266 ou ESP32 no gateway WiFi via UART, mas esse tipo contradiz todo o conceito de placa única)
O conector USB(-C) pode ser usado no modo de função dupla: como fonte de alimentação e pseudo rede chamada RNDIS (Ethernet virtual sobre USB)
Sem HDMI / Saída de vídeo
não tem saída de vídeo, na melhor das hipóteses pode ser conectado LCD baseado em I2C ou SPI e funcionar como framebuffer (veja este postcomo um começo)
Pinagem
Até 26 pinos GPIO no HEADER MilkV-Duo de 40 pinos fornecem acesso a periféricos internos, como SDIO, I2C, PWM, SPI, J-TAG e UART
[root@milkv-duo]~# ls /bin
arch dmesg linux64 nuke sleep
ash dnsdomainname ln pidof stty
base32 dumpkmap login ping su
base64 echo ls pipe_progress sync
busybox egrep lsattr printenv tar
cat false mk_cmds ps touch
chattr fdflush mkdir pwd true
chgrp fgrep mknod resume umount
chmod getopt mktemp rm uname
chown grep more rmdir usleep
compile_et gunzip mount run-parts vi
cp gzip mountpoint sed watch
cpio hostname mt setarch zcat
date kill mv setpriv
dd link netstat setserial
df linux32 nice sh
/usr/bin
[root@milkv-duo]~# ls /usr/bin/
[ fold od tee
[[ free openvt telnet
ar fuser passwd test
ascii gcore paste tftp
awk gdb patch time
basename gdb-add-index pip top
bc head pip3 tr
bunzip2 hexdump pip3.9 traceroute
bzcat hexedit printf truncate
chrt hostid pyserial-miniterm ts
chvt htop pyserial-ports tty
cksum id python uniq
clear install python3 unix2dos
cmp ipcrm python3.9 unlink
crc32 ipcs readlink unlzma
crontab killall realpath unlzop
cut last renice unxz
cvi_pinmux less reset unzip
dbclient logger resize uptime
dc logname scp uudecode
deallocvt lsof seq uuencode
diff lspci setfattr vlock
dirname lsscsi setkeycodes w
dos2unix lsusb setsid wc
dropbearconvert lzcat sha1sum wget
dropbearkey lzma sha256sum which
du lzopcat sha3sum who
easy_install md5sum sha512sum whoami
easy_install-3.9 mesg shred xargs
eject microcom smtpd.py.9 xmlcatalog
env mkfifo sort xmllint
event_rpcgen.py mkpasswd ssh xmlwf
evtest nl strace xsltproc
expr nohup strace-log-merge xxd
factor nproc strings xz
fallocate nslookup svc xzcat
find ntpdate svok yes
flock ntptime tail
[root@milkv-duo]~# ls -1 /usr/bin/ | wc -l
151
Vários Milk-V Duos / IPs alternativos
Para oferecer suporte a vários Milk-V Duos no mesmo host via USB-C, você atribui a cada placa sua própria rede:
placa 1: 192.168.51 .0
placa 2: 192.168.52 .0
placa 3: 192.168.53 .0
Edite em cada quadro dois arquivos :
/mnt/system/usb-rndis.sh(baseado em buildroot) ou /etc/usb-rndis.sh(outros sistemas):
ifconfig usb0 192.168.51.1
/etc/dnsmasq.conf:
dhcp-range=192.168.51.2,192.168.51.242,1h
Para adicionar uma nova placa, faça login em 192.168.42.1 como de costume e altere para 192.168.52.1 e assim por diante.
Redimensionando Disco (16Gb)
Por padrão, todo o espaço disponível no cartão SD é de apenas 1 GB (ou 2 GB caso você use outra distribuição), mas você pode disponibilizar o restante do cartão SD, /datapor exemplo
%
% fdisk /dev/mmcblk0
n (new partition)
p (primary partition)
4
<RETURN> (confirm start selection)
<RETURN> (confirm end selection)
w
q
% reboot
De acordo com este post, tinycc tem sido portador – C compiler and C interpreter in one – baixe este .zip (mirror) e rode install.sh, fazendo antes ele um executável.
OLED SSD1306 conectado ao Milk-V Duo via I2C, controlado via binário RISC-V ssd1306do ssd1306_linux
Imagem de disco personalizada BuildRoot Milk-V Duo
% cd duo-buildroot-sdk/buildroot-2021.05% make menuconfig
então vá para “Pacotes de destino” e depois percorra:
Aplicações de áudio e vídeo
Compressores e descompressores
Depuração, criação de perfil e benchmark
Ferramentas de desenvolvimento
Utilitários de sistema de arquivos e flash
Fontes, cursores, ícones, sons e temas
Jogos
Bibliotecas e aplicações gráficas (gráfico/texto)
Manuseio de hardware
Linguagens de interpretação e script
Bibliotecas
Correspondência
Variado
Aplicações de rede
Gerenciadores de pacotes
Realtime
Segurança
Shell e utilitários
Ferramentas do sistema
Editores e visualizadores de texto
depois de selecionar os pacotes que deseja incluir, escolha “Save” e confirme como '.config' e depois “Exit”.
% cp .configconfigs/milkv_duo_musl_riscv64_defconfig
% cd ..
% ./build_milkv.sh
e depois de um tempo, dependendo de quantos pacotes você selecionou, você encontrará na out/pasta sua nova imagem de disco que você pode copiar para o cartão SD.
Nota : buildrooté um pacote bastante peculiar, por exemplo, quando você seleciona um pacote e faz uma compilação, depois desmarca um pacote, ele ainda será incluído - pior, se você fizer um commit um estado clear em output/, alguns pacotes podem não ser mais compilados completamente - você tem que voltar a um estado anterior com menos pacotes, refazer a compilação e reiniciar a seleção de novos pacotes.
Acesso à Internet para Milk-V Duo
RNDIS (Ethernet Virtual sobre USB)
O host precisa executar Ethernet sobre USB e também operar como roteador transparente e permitir que as placas conectadas alcancem a Internet, veja este guia, aqui está uma breve descrição:
===========================================Tradução Depois de conectar ao computador usando um cabo de dados tipo C, uma nova placa de rede apareceu
dmesg -T
[Sun Aug 27 19:59:28 2023] usb 3-5: new high-speed USB device number 8 using xhci_hcd
[Sun Aug 27 19:59:28 2023] usb 3-5: New USB device found, idVendor=3346, idProduct=1009, bcdDevice= 5.10
[Sun Aug 27 19:59:28 2023] usb 3-5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[Sun Aug 27 19:59:28 2023] usb 3-5: Product: RNDIS
[Sun Aug 27 19:59:28 2023] usb 3-5: Manufacturer: Cvitek
[Sun Aug 27 19:59:28 2023] usb 3-5: SerialNumber: 0123456789
[Sun Aug 27 19:59:28 2023] rndis_host 3-5:1.0 usb0: register 'rndis_host' at usb-0000:00:14.0-5, RNDIS device, 72:80:5a:ac:54:4f
[Sun Aug 27 19:59:28 2023] rndis_host 3-5:1.0 enp0s20u5: renamed from usb0
Use o comando ip para verificar o status da placa de rede
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
3: enp6s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 0a:e0:af:b7:01:bd brd ff:ff:ff:ff:ff:ff
4: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 04:cf:4b:21:d1:1c brd ff:ff:ff:ff:ff:ff
inet 192.168.2.212/24 brd 192.168.2.255 scope global dynamic noprefixroute wlan0
valid_lft 57551sec preferred_lft 57551sec
inet6 fe80::6cf:4bff:fe21:d11c/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
8: enp0s20u5: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 72:80:5a:ac:54:4f brd ff:ff:ff:ff:ff:ff
Entre eles, a placa de rede enp0s20u5 é o dispositivo de placa de rede controlado por RNDIS e wlan0 é a placa de rede que se conecta ao meu roteador doméstico.
Neste estado inicial, embora o endereço IP 192.168.42.1/24 esteja fixado internamente no Milk-V Duo, não há roteamento, portanto é impossível fazer ping ou SSH para a placa de desenvolvimento.
O enp0s20u5 aqui na verdade atua como um gateway. Precisamos instalar a placa de rede no host e configurar um IP para ela:
ip a add 192.168.42.254/24 dev enp0s20u5
ip l set enp0s20u5 up
Agora verifique o status
ip a show enp0s20u5
8: enp0s20u5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000
link/ether 72:80:5a:ac:54:4f brd ff:ff:ff:ff:ff:ff
inet 192.168.42.254/24 scope global enp0s20u5
valid_lft forever preferred_lft forever
inet6 fe80::7080:5aff:feac:544f/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
Agora descobri que posso executar ping no endereço IP fixo da placa de desenvolvimento 192.168.42.1:
ping 192.168.42.1
PING 192.168.42.1 (192.168.42.1) 56(84) bytes of data.
64 bytes from 192.168.42.1: icmp_seq=1 ttl=64 time=0.650 ms
64 bytes from 192.168.42.1: icmp_seq=2 ttl=64 time=0.322 ms
64 bytes from 192.168.42.1: icmp_seq=3 ttl=64 time=0.324 ms
Agora podemos conectar via ssh normalmente:
[root@archlinux ~]# ssh root@192.168.42.1
root@192.168.42.1's password:
[root@milkv]~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN qlen 1000
link/ether 4a:7c:ad:96:7a:e6 brd ff:ff:ff:ff:ff:ff
3: usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 7e:d3:33:9a:4a:21 brd ff:ff:ff:ff:ff:ff
inet 192.168.42.1/24 brd 192.168.42.255 scope global usb0
valid_lft forever preferred_lft forever
No entanto, ainda não consigo acessar a rede externa. Motivo:
Nenhuma rota padrão está configurada e não pode ser encontrada
Nenhum endereço de resolução de nome de domínio está configurado (opcional)
(O mais importante é) Atualmente, existem apenas rotas diretas entre o host e a placa de desenvolvimento Duo, e eles não podem acessar segmentos de rede diferentes de 192.168.42.0/24.
Então, a seguir, resolveremos esses problemas por sua vez
Configurar a rota padrão da placa de desenvolvimento
[root@milkv]~# ip r
192.168.42.0/24 dev usb0 scope link src 192.168.42.1
[root@milkv]~# ip r add default via 192.168.42.254[root@milkv]~# ip r
default via 192.168.42.254 dev usb0
192.168.42.0/24 dev usb0 scope link src 192.168.42.1
Configurar endereço de resolução de nome de domínio
[root@milkv]~# echo'nameserver 114.114.114.114' >> /etc/resolv.conf[root@milkv]~# cat /etc/resolv.conf# Generated by dhcpcd# /etc/resolv.conf.head can replace this line# /etc/resolv.conf.tail can replace this linenameserver 114.114.114.114
Configure as regras do iptables no host e habilite o SNAT (tradução de endereço de origem). Observe que esta configuração não está na placa de desenvolvimento Milk-V Duo.
Você também precisa verificar a configuração do kernel para ver se a função de encaminhamento está habilitada. Caso contrário, você precisa habilitá-la através do sysctl:
# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
# sysctl net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1 Agora entre na placa de desenvolvimento novamente e você descobrirá que agora pode acessar a rede externa normalmente:
[root@milkv]~# ping baidu.com
PING baidu.com (39.156.66.10): 56 data bytes
64 bytes from 39.156.66.10: seq=0 ttl=44 time=32.189 ms
64 bytes from 39.156.66.10: seq=1 ttl=44 time=31.949 ms
64 bytes from 39.156.66.10: seq=2 ttl=44 time=76.551 ms
^C
--- baidu.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 31.949/46.896/76.551 ms
[root@milkv]~# wget baidu.com
Connecting to baidu.com (110.242.68.66:80)
saving to 'index.html'
index.html 100% |********************************| 81 0:00:00 ETA
'index.html' saved ===========================================
No anfitrião
O outgoing_if é a interface de saída, either eth0or wpl0s0or something, verifique com ifconfigo nome apropriado e então rootexecute:
Além disso, descubra qual IP seu host obteve ( ip_of_host ) da placa conectada, por exemplo 192.168.42.120, verifique também com ifconfig.
No quadro
% ip r add default viaip_of_host
% echo "nameserver 8.8.8.8" >> /etc/resolv.conf
IP estático para host com RNDIS
O que pode parecer simples, na verdade não é tão fácil assim, já que o próprio RNDIS é o culpado:
pode-se limitar o intervalo de IP para dnsmasq.confque seja o mesmo IP, mas
como o RNDIS atribui endereços MAC aleatórios ao host RNDIS (a placa) e o cliente RNDIS (o host ao qual a placa está conectada) o trata como um novo dispositivo a cada inicialização – se você forçá-lo a ter o mesmo IP novamente, o host não obterá um novo IP via DHCP, pois ele tem o IP lembrado para outro endereço MAC...
é uma bagunça
Então, uma solução funcional é:
/etc/rndis-macs.shque gera dois endereços MAC aleatórios, mas os mantém persistentes então:
#!/bin/bash
RNDIS_USB="/tmp/usb/usb_gadget/cvitek/functions/rndis.usb0"
MAC_FILE="/etc/rndis-macs.conf"
generate_random_mac() {
printf "02:%02x:%02x:%02x:%02x:%02x\n" $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256))
}
# check if the MAC address file exists and has exactly two lines
if [[ -f "$MAC_FILE" ]] && [[ $(wc -l < "$MAC_FILE") -eq 2 ]]; then
# read the two MAC addresses from the file
IFS=$'\n' read -d '' -r -a macs < "$MAC_FILE"
dev="${macs[0]}"
host="${macs[1]}"
echo "using existing MAC addresses:"
else
# generate two new MAC addresses and store them in the file
echo "generating new MAC addresses:"
dev=$(generate_random_mac)
host=$(generate_random_mac)
echo "$dev" > "$MAC_FILE"
echo "$host" >> "$MAC_FILE"
fi
echo "dev_addr: $dev"
echo "host_addr: $host"
echo "$dev" > "$RNDIS_USB"/dev_addr
echo "$host" > "$RNDIS_USB"/host_addr
/etc/usb-rndis.sh:
/etc/uhubon.sh device >> /tmp/rndis.log 2>&1
/etc/run_usb.sh probe rndis >> /tmp/rndis.log 2>&1
/etc/rndis-macs.sh >> /tmp/rndis.log 2>&1
/etc/run_usb.sh start rndis >> /tmp/rndis.log 2>&1
sleep 0.5
ip link set dev usb0 up
ip a add 192.168.42.1/24 dev usb0
ip r add default via 192.168.42.2
sleep 0.5
systemctl start dnsmasq
Observação : se você tinha 192.168.42.2 atribuído ao host, escolha outro IP “estático” em seu intervalo, pois seu host se lembrou do IP de um endereço MAC específico e não o aceitará novamente, por exemplo, 192.168.42.200 ou algo assim.
Sobre a SMARTCORE
A SMARTCORE FORNECE CHIPS E MÓDULOS PARA IOT, COMUNICAÇÃO WIRELESS, BIOMETRIA, CONECTIVIDADE, RASTREAMENTO E AUTOMAÇÃO. NOSSO PORTFÓLIO INCLUI MODEM 2G/3G/4G/NB-IOT, SATELITAL, MÓDULOS WIFI, BLUETOOTH, GPS, SIGFOX, LORA, LEITOR DE CARTÃO, LEITOR QR CCODE, MECANISMO DE IMPRESSÃO, MINI-BOARD PC, ANTENA, PIGTAIL, BATERIA, REPETIDOR GPS E SENSORES.
Nenhum comentário:
Postar um comentário