Características
Processador
- Processadores RISC-V C906 de 1 GHz e 700 MHz
- 8051 com SRAM de 8/6 KB
- TPU CVITEK integrado para detecção inteligente
- 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 post como 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
- Até 3x I2C
- Até 5x UART
- Até 1x SDIO1
- Até 1x SPI
- Até 2x ADC
- Até 7x PWM
- Até 1x RUN
- Até 1x JTAG
LUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[ 0.000000] rcu: Preemptible hierarchical RCU implementation.
[ 0.000000] rcu: RCU event tracing is enabled.
[ 0.000000] Trampoline variant of Tasks RCU enabled.
[ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
[ 0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
[ 0.000000] riscv-intc: 64 local interrupts mapped
[ 0.000000] plic: interrupt-controller@70000000: mapped 101 interrupts with 1 handlers for 2 contexts.
[ 0.000000] random: get_random_bytes called from start_kernel+0x2e0/0x41c with crng_init=0
[ 0.000000] riscv_timer_init_dt: Registering clocksource cpuid [0] hartid [0]
[ 0.000000] clocksource: riscv_clocksource: mask: 0xffffffffffffffff max_cycles: 0x5c40939b5, max_idle_ns: 440795202646 ns
[ 0.000009] sched_clock: 64 bits at 25MHz, resolution 40ns, wraps every 4398046511100ns
[ 0.008425] Calibrating delay loop (skipped), value calculated using timer frequency.. 50.00 BogoMIPS (lpj=100000)
[ 0.019128] pid_max: default: 4096 minimum: 301
[ 0.024025] Mount-cache hash table entries: 512 (order: 0, 4096 bytes, linear)
[ 0.031444] Mountpoint-cache hash table entries: 512 (order: 0, 4096 bytes, linear)
[ 0.041119] ASID allocator initialised with 65536 entries
[ 0.046849] rcu: Hierarchical SRCU implementation.
[ 0.052223] EFI services will not be available.
[ 0.057313] devtmpfs: initialized
[ 0.066807] early_time_log: do_initcalls: 4548979us
[ 0.072472] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
[ 0.082528] futex hash table entries: 16 (order: -4, 384 bytes, linear)
[ 0.089496] pinctrl core: initialized pinctrl subsystem
[ 0.095414] NET: Registered protocol family 16
[ 0.100480] DMA: preallocated 128 KiB GFP_KERNEL pool for atomic allocations
[ 0.107813] DMA: preallocated 128 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
[ 0.116713] thermal_sys: Registered thermal governor 'step_wise'
[ 0.132538] OF: /gpio@03020000/gpio-controller@0: could not find phandle
[ 0.145753] OF: /gpio@03021000/gpio-controller@1: could not find phandle
[ 0.152748] OF: /gpio@03022000/gpio-controller@2: could not find phandle
[ 0.159737] OF: /gpio@03023000/gpio-controller@3: could not find phandle
[ 0.166722] OF: /gpio@05021000/gpio-controller@4: could not find phandle
[ 0.175540] clk reset: nr_reset=64 resource_size=8
[ 0.181130] get audio clk=24576000
[ 0.184672] cvitek-i2s-subsys 4108000.i2s_subsys: Set clk_sdma_aud0~3 to 24576000
[ 0.205405] dw_dmac 4330000.dma: CVITEK DMA Controller, 8 channels, probe done!
[ 0.213805] SCSI subsystem initialized
[ 0.218237] usbcore: registered new interface driver usbfs
[ 0.224017] usbcore: registered new interface driver hub
[ 0.229634] usbcore: registered new device driver usb
[ 0.238395] Ion: ion_parse_dt_heap_common: id 0 type 2 name carveout align 1000
[ 0.246344] Ion: rmem_ion_device_init: heap carveout base 0x0000000082473000 size 0x0000000001acd000 dev (____ptrval____)
[ 0.257624] ion_carveout_heap_create, size=0x1acd000
[ 0.262937] cvi_get_rtos_ion_size, rtos ion_size get:0x0
[ 0.398272] platform carveout: [ion] add heap id 0, type 2, base 0x82473000, size 0x1acd000
[ 0.407276] Advanced Linux Sound Architecture Driver Initialized.
[ 0.414938] clocksource: Switched to clocksource riscv_clocksource
[ 0.423536] NET: Registered protocol family 2
[ 0.429180] tcp_listen_portaddr_hash hash table entries: 256 (order: 0, 4096 bytes, linear)
[ 0.437895] TCP established hash table entries: 512 (order: 0, 4096 bytes, linear)
[ 0.445680] TCP bind hash table entries: 512 (order: 0, 4096 bytes, linear)
[ 0.452950] TCP: Hash tables configured (established 512 bind 512)
[ 0.459557] UDP hash table entries: 128 (order: 0, 4096 bytes, linear)
[ 0.466324] UDP-Lite hash table entries: 128 (order: 0, 4096 bytes, linear)
[ 0.473794] NET: Registered protocol family 1
[ 0.479012] RPC: Registered named UNIX socket transport module.
[ 0.485127] RPC: Registered udp transport module.
[ 0.490010] RPC: Registered tcp transport module.
[ 0.494934] RPC: Registered tcp NFSv4.1 backchannel transport module.
[ 0.504220] Initialise system trusted keyrings
[ 0.509141] workingset: timestamp_bits=62 max_order=13 bucket_order=0
[ 0.524041] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[ 0.531324] jffs2: version 2.2. (NAND) © 2001-2006 Red Hat, Inc.
[ 0.538516] Key type asymmetric registered
[ 0.542733] Asymmetric key parser 'x509' registered
[ 0.554087] Serial: 8250/16550 driver, 5 ports, IRQ sharing disabled
[ 0.562710] printk: console [ttyS0] disabled
[ 0.567239] 4140000.serial: ttyS0 at MMIO 0x4140000 (irq = 15, base_baud = 1562500) is a 16550A
[ 0.576276] printk: console [ttyS0] enabled
[ 0.584875] printk: bootconsole [sbi0] disabled
[ 0.595241] 41c0000.serial: ttyS4 at MMIO 0x41c0000 (irq = 16, base_baud = 1562500) is a 16550A
[ 0.607812] cvi-spif 10000000.cvi-spif: unrecognized JEDEC id bytes: 00 00 00 00 00 00
[ 0.616044] cvi-spif 10000000.cvi-spif: device scan failed
[ 0.621769] cvi-spif 10000000.cvi-spif: unable to setup flash chip
[ 0.635092] libphy: Fixed MDIO Bus: probed
[ 0.639938] bm-dwmac 4070000.ethernet: IRQ eth_wake_irq not found
[ 0.646304] bm-dwmac 4070000.ethernet: IRQ eth_lpi not found
[ 0.652286] bm-dwmac 4070000.ethernet: Hash table entries set to unexpected value 0
[ 0.660361] bm-dwmac 4070000.ethernet: no reset control found
[ 0.666605] bm-dwmac 4070000.ethernet: User ID: 0x10, Synopsys ID: 0x37
[ 0.673525] bm-dwmac 4070000.ethernet: DWMAC1000
[ 0.678424] bm-dwmac 4070000.ethernet: DMA HW capability register supported
[ 0.685641] bm-dwmac 4070000.ethernet: RX Checksum Offload Engine supported
[ 0.692858] bm-dwmac 4070000.ethernet: COE Type 2
[ 0.697743] bm-dwmac 4070000.ethernet: TX Checksum insertion supported
[ 0.704512] bm-dwmac 4070000.ethernet: Normal descriptors
[ 0.710115] bm-dwmac 4070000.ethernet: Ring mode enabled
[ 0.715630] bm-dwmac 4070000.ethernet: Enable RX Mitigation via HW Watchdog Timer
[ 0.723389] bm-dwmac 4070000.ethernet: device MAC address 96:8d:89:ed:5b:ca
[ 0.758200] libphy: stmmac: probed
[ 0.763554] bm-dwmac 4070000.ethernet: Cannot get clk_500m_eth!
[ 0.769815] bm-dwmac 4070000.ethernet: Cannot get gate_clk_axi4!
[ 0.777191] dwc2 4340000.usb: axi clk installed
[ 0.781982] dwc2 4340000.usb: apb clk installed
[ 0.786726] dwc2 4340000.usb: 125m clk installed
[ 0.791530] dwc2 4340000.usb: 33k clk installed
[ 0.796239] dwc2 4340000.usb: 12m clk installed
[ 0.801042] dwc2 4340000.usb: EPs: 8, dedicated fifos, 3072 entries in SPRAM
[ 0.808950] dwc2 4340000.usb: DWC OTG Controller
[ 0.813824] dwc2 4340000.usb: new USB bus registered, assigned bus number 1
[ 0.821096] dwc2 4340000.usb: irq 36, io mem 0x04340000
[ 0.827545] hub 1-0:1.0: USB hub found
[ 0.831570] hub 1-0:1.0: 1 port detected
[ 0.837416] usbcore: registered new interface driver usb-storage
[ 0.844106] i2c /dev entries driver
[ 0.849865] sdhci: Secure Digital Host Controller Interface driver
[ 0.856316] sdhci: Copyright(c) Pierre Ossman
[ 0.860841] sdhci-pltfm: SDHCI platform and OF driver helper
[ 0.867007] cvi:sdhci_cvi_probe
[ 0.914963] mmc0: SDHCI controller on 4310000.cv-sd [4310000.cv-sd] using ADMA 64-bit
[ 0.923131] cvi_proc_init cvi_host 0x(____ptrval____)
[ 0.929146] usbcore: registered new interface driver usbhid
[ 0.938965] usbhid: USB HID core driver
[ 0.944921] cvitek-i2s 4100000.i2s: cvi_i2s_probe
[ 0.955198] cvitek-i2s 4130000.i2s: cvi_i2s_probe
[ 0.960922] cviteka-adc sound_adc: cviteka_adc_probe, dev name=sound_adc
[ 0.968044] cviteka-adc sound_adc: cviteka_adc_probe start devm_snd_soc_register_card
[ 0.976650] cvitekaadc 300a100.adc: cvitekaadc_probe
[ 0.987619] cviteka-dac sound_dac: cviteka_dac_probe, dev name=sound_dac
[ 0.995091] cvitekadac 300a000.dac: cvitekadac_probe
[ 1.000685] cvitekadac_probe gpio_is_valid mute_pin_l
[ 1.006585] NET: Registered protocol family 17
[ 1.011477] Loading compiled-in X.509 certificates
[ 1.039015] mmc0: new SDHC card at address 0001
[ 1.051483] mmcblk0: mmc0:0001 MSD20 14.6 GiB
[ 1.061126] cviteka-adc sound_adc: cviteka_adc_probe, dev name=sound_adc
[ 1.068302] cviteka-adc sound_adc: cviteka_adc_probe start devm_snd_soc_register_card
[ 1.080491] mmcblk0: p1 p2 p3
[ 1.088431] cviteka-dac sound_dac: cviteka_dac_probe, dev name=sound_dac
[ 1.101557] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[ 1.112515] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
[ 1.119630] cfg80211: failed to load regulatory.db
[ 1.124824] ALSA device list:
[ 1.128383] dw-apb-uart 4140000.serial: forbid DMA for kernel console
[ 1.148546] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)
[ 1.157087] VFS: Mounted root (ext4 filesystem) on device 179:2.
[ 1.166212] devtmpfs: mounted
[ 1.169547] Freeing unused kernel memory: 144K
[ 1.174226] Kernel memory protection not selected by kernel config.
[ 1.180757] Run /sbin/init as init process
[ 1.185024] with arguments:
[ 1.188116] /sbin/init
[ 1.190917] with environment:
[ 1.194189] HOME=/
[ 1.196652] TERM=linux
[ 1.199477] early_time_log: run_init_process: 5681657us
[ 1.307708] EXT4-fs (mmcblk0p2): re-mounted. Opts: errors=remount-ro
[ 1.395862] random: fast init done
[ 1.511578] random: dd: uninitialized urandom read (512 bytes read)
[ 1.725888] random: dhcpcd: uninitialized urandom read (112 bytes read)
[ 1.817530] bm-dwmac 4070000.ethernet eth0: PHY [stmmac-0:00] driver [Generic PHY] (irq=POLL)
[ 1.839025] dwmac1000: Master AXI performs any burst length
[ 1.845702] bm-dwmac 4070000.ethernet eth0: No Safety Features support found
[ 1.853923] bm-dwmac 4070000.ethernet eth0: IEEE 1588-2002 Timestamp supported
[ 1.862474] bm-dwmac 4070000.ethernet eth0: configuring for phy/rmii link mode
[ 7.195361] random: dnsmasq: uninitialized urandom read (128 bytes read)
[ 7.202528] random: dnsmasq: uninitialized urandom read (48 bytes read)
[ 7.250085] cv180x_sys: bad vermagic: kernel tainted.
[ 7.255425] Disabling lock debugging due to kernel taint
[ 7.261336] cv180x_sys: loading out-of-tree module taints kernel.
[ 7.294527] res-reg: start: 0xa0c8000, end: 0xa0c801f, virt-addr(ffffffd0040c9000).
[ 7.303316] CVITEK CHIP ID = 22
[ 7.318433] cvi_rtos_cmdqu_probe start ---
[ 7.322806] name=1900000.rtos_cmdqu
[ 7.327194] res-reg: start: 0x1900000, end: 0x1900fff, virt-addr(ffffffd004228000).
[ 7.335254] cvi_rtos_cmdqu_probe DONE
[ 7.339691] [cvi_spinlock_init] success
[ 7.377509] cif a0c2000.cif: cam0 clk installed
[ 7.382321] cif a0c2000.cif: cam1 clk installed
[ 7.387481] cif a0c2000.cif: vip_sys_2 clk installed
[ 7.392945] cif a0c2000.cif: clk_mipimpll clk installed (____ptrval____)
[ 7.400203] cif a0c2000.cif: clk_disppll clk installed (____ptrval____)
[ 7.407370] cif a0c2000.cif: clk_fpll clk installed (____ptrval____)
[ 7.414298] cif a0c2000.cif: (0) res-reg: start: 0xa0c2000, end: 0xa0c3fff.
[ 7.421797] cif a0c2000.cif: virt-addr((____ptrval____))
[ 7.427690] cif a0c2000.cif: (1) res-reg: start: 0xa0d0000, end: 0xa0d0fff.
[ 7.435183] cif a0c2000.cif: virt-addr((____ptrval____))
[ 7.441074] cif a0c2000.cif: (2) res-reg: start: 0xa0c4000, end: 0xa0c5fff.
[ 7.448559] cif a0c2000.cif: virt-addr((____ptrval____))
[ 7.454448] cif a0c2000.cif: (3) res-reg: start: 0x3001c30, end: 0x3001c5f.
[ 7.461933] cif a0c2000.cif: virt-addr((____ptrval____))
[ 7.467824] cif a0c2000.cif: no pad_ctrl for cif
[ 7.472974] cif a0c2000.cif: request irq-26 as cif-irq0
[ 7.478759] cif a0c2000.cif: request irq-27 as cif-irq1
[ 7.484514] cif a0c2000.cif: rst_pin = 424, pol = 1
[ 7.499342] snsr_i2c snsr_i2c: i2c:-------hook 0
[ 7.504362] snsr_i2c snsr_i2c: i2c:-------hook 1
[ 7.509771] snsr_i2c snsr_i2c: i2c:-------hook 2
[ 7.515073] snsr_i2c snsr_i2c: i2c:-------hook 3
[ 7.519993] snsr_i2c snsr_i2c: i2c:-------hook 4
[ 7.596322] vi_core_probe:203(): res-reg: start: 0xa000000, end: 0xa07ffff, virt-addr(ffffffd004400000).
[ 7.606219] vi_core_probe:216(): irq(28) for isp get from platform driver.
[ 7.614260] vi_tuning_buf_setup:253(): tuning fe_addr[0]=0x8183f490, be_addr[0]=0x81837290, post_addr[0]=0x81820000
[ 7.625482] vi_tuning_buf_setup:253(): tuning fe_addr[1]=0x8193f490, be_addr[1]=0x81937290, post_addr[1]=0x81920000
[ 7.636654] vi_tuning_buf_setup:253(): tuning fe_addr[2]=0x8185f490, be_addr[2]=0x81857290, post_addr[2]=0x81840000
[ 7.647773] sync_task_init:177(): sync_task_init vi_pipe 0
[ 7.653739] sync_task_init:177(): sync_task_init vi_pipe 1
[ 7.659725] sync_task_init:177(): sync_task_init vi_pipe 2
[ 7.666173] vi_core_probe:252(): isp registered as cvi-vi
[ 7.750302] cvi_dwa_probe:487(): done with rc(0).
[ 7.791388] cv180x-cooling cv180x_cooling: elems of dev-freqs=6
[ 7.797661] cv180x-cooling cv180x_cooling: dev_freqs[0]: 850000000 500000000
[ 7.805487] cv180x-cooling cv180x_cooling: dev_freqs[1]: 425000000 375000000
[ 7.813089] cv180x-cooling cv180x_cooling: dev_freqs[2]: 425000000 300000000
[ 7.820782] cv180x-cooling cv180x_cooling: Cooling device registered: cv180x_cooling
[ 7.866285] jpu ctrl reg pa = 0xb030000, va = (____ptrval____), size = 256
[ 7.873985] end jpu_init result = 0x0
[ 8.065890] cvi_vc_drv_init result = 0x0
[ 8.080795] sh (172): drop_caches: 3
[ 8.261909] using random self ethernet address
[ 8.261928] using random host ethernet address
[ 8.309722] usb0: HOST MAC 6e:54:6b:61:a9:f5
[ 8.312146] usb0: MAC ce:b2:db:da:82:7b
[ 8.312220] dwc2 4340000.usb: bound driver configfs-gadget
[ 8.346187] dwc2 4340000.usb: new device is high-speed
[ 8.391171] dwc2 4340000.usb: new device is high-speed
[ 8.682141] dwc2 4340000.usb: new device is high-speed
[ 8.750359] dwc2 4340000.usb: new address 14
[ 57.067015] random: crng init done
Nota: usb0: HOST MAC e MAC são definidos aleatoriamente e mudam após cada (re)inicialização.
/proc/cpuinfo
[root@milkv-duo]~# more /proc/cpuinfo
processor : 0
hart : 0
isa : rv64imafdvcsu
mmu : sv39
df
[root@milkv-duo]~# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/root 763327 157774 562136 22% /
devtmpfs 14680 0 14680 0% /dev
tmpfs 14752 0 14752 0% /dev/shm
tmpfs 14752 52 14700 0% /tmp
tmpfs 14752 28 14724 0% /run
[root@milkv-duo]~# df -h
Filesystem Size Used Available Use% Mounted on
/dev/root 745.4M 154.1M 549.0M 22% /
devtmpfs 14.3M 0 14.3M 0% /dev
tmpfs 14.4M 0 14.4M 0% /dev/shm
tmpfs 14.4M 52.0K 14.4M 0% /tmp
tmpfs 14.4M 28.0K 14.4M 0% /run
ps
PID USER COMMAND
1 root init
2 root [kthreadd]
3 root [rcu_gp]
4 root [rcu_par_gp]
5 root [kworker/0:0-eve]
7 root [kworker/u2:0-ev]
8 root [mm_percpu_wq]
9 root [ksoftirqd/0]
10 root [rcu_preempt]
11 root [kdevtmpfs]
12 root [rcu_tasks_kthre]
13 root [oom_reaper]
14 root [writeback]
15 root [kcompactd0]
24 root [kblockd]
25 root [watchdogd]
27 root [kworker/0:1H-mm]
28 root [rpciod]
29 root [kworker/u3:0]
30 root [xprtiod]
31 root [cfg80211]
32 root [kswapd0]
33 root [nfsiod]
34 root [spi0]
35 root [spi1]
36 root [stmmac_wq]
37 root [kworker/u2:1]
70 root [irq/45-cviusb-o]
71 root [irq/46-cd-gpio-]
72 root [sdhci]
73 root [irq/23-mmc0]
75 root [ion_system_heap]
76 root [mmc_complete]
81 root [jbd2/mmcblk0p2-]
82 root [ext4-rsv-conver]
97 root /sbin/syslogd -n
101 root /sbin/klogd -n
131 dhcpcd dhcpcd: [master] [ip4]
132 root dhcpcd: [privileged actioneer]
133 dhcpcd dhcpcd: [network proxy]
134 dhcpcd dhcpcd: [control proxy]
147 root [kworker/0:3-eve]
156 root /usr/sbin/ntpd -g -p /var/run/ntpd.pid
165 root /usr/sbin/dropbear -R
170 nobody /usr/sbin/dnsmasq
180 root [cvitask_isp_pre]
181 root [cvitask_isp_bla]
182 root [cvitask_isp_err]
184 root [cvitask_vpss_0]
185 root [cvitask_vpss_1]
187 root [gdc_work]
192 root [cvitask_tpu_wor]
198 root {S99user} /bin/sh /etc/init.d/S99user start
199 root [kworker/0:2H]
211 root -sh
1297 root /usr/sbin/dropbear -R
1302 root -sh
1331 root sleep 0.5
1332 root ps
/bin
[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, /data
por exemplo
%
% fdisk /dev/mmcblk0
n (new partition)
p (primary partition)
4
<RETURN> (confirm start selection)
<RETURN> (confirm end selection)
w
q
% reboot
e faça login novamente, continue com:
% mkfs.ext4 /dev/mmcblk0p4
% echo "/dev/mmcblk0p4 /data ext4 defaults 0 0" >> /etc/fstab
% reboot
ao efetuar login novamente, você verá o novo espaço disponível:
Iniciar script na inicialização
A partir da imagem do sistema V1.0.4, o /etc/init.d/S99user
executa /mnt/data/auto.sh
se existir:
% mkdir /mnt/data
% vi /mnt/data/auto.sh
e liste cada um dos processos:
/path/to/my/script.sh &
python /path/to/another/script.py &
TinyCC
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.
Ou make menuconfig e habilite TCC
ubuntu@DESKTOP-UHGFA4M:~/duo-buildroot-sdk$ubuntu@DESKTOP-UHGFA4M:~/duo-buildroot-sdk$ ./build.sh milkv-duo256m
% chmod +x /usr/local/bin/tcc
e comece brincando test.c
:
#!/usr/local/bin/tcc -run
#include <stdio.h>
int main(int argc, char **argv) {
printf("%s---\n", "hello milk-v!");
return 0;
}
% tcc -o test test.c
% ./test
hello milk-v!---
% chmod +x test.c
% ./test.c
hello milk-v!---
Obrigado Yang que portou e permitiu o donwload
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.
Ou make menuconfig e habilite TCC
% chmod +x /usr/local/bin/tcc
e comece brincando test.c
:
#!/usr/local/bin/tcc -run
#include <stdio.h>
int main(int argc, char **argv) {
printf("%s---\n", "hello milk-v!");
return 0;
}
% tcc -o test test.c
% ./test
hello milk-v!---
% chmod +x test.c
% ./test.c
hello milk-v!---
Obrigado Yang que portou e permitiu o donwload
I2C: SSD1306 OLED
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 .config configs/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.
% 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 .config configs/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:
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
ip r
192.168.42.0/24 dev usb0 scope link src 192.168.42.1
ip r add default via 192.168.42.254
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
echo 'nameserver 114.114.114.114' >> /etc/resolv.conf
cat /etc/resolv.conf
Generated by dhcpcd
/etc/resolv.conf.head can replace this line
/etc/resolv.conf.tail can replace this line
nameserver 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.
iptables -t nat -A POSTROUTING -s 192.168.42.0/24 -o wlan0 -j MASQUERADE检查一下
iptables -t nat -S
删除这条规则
iptables -t nat -D POSTROUTING -s 192.168.42.0/24 -o wlan0 -j MASQUERADE
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:
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
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 eth0
or wpl0s0
or something, verifique com ifconfig
o nome apropriado e então root
execute:
% sysctl net.ipv4.ip_forward=1
% iptables -P FORWARD ACCEPT
% iptables -t nat -A POSTROUTING -o outgoing_if -j MASQUERADE
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 via ip_of_host
% echo "nameserver 8.8.8.8" >> /etc/resolv.conf
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: 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
ip r 192.168.42.0/24 dev usb0 scope link src 192.168.42.1 ip r add default via 192.168.42.254 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
echo 'nameserver 114.114.114.114' >> /etc/resolv.conf cat /etc/resolv.conf Generated by dhcpcd /etc/resolv.conf.head can replace this line /etc/resolv.conf.tail can replace this line nameserver 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.
iptables -t nat -A POSTROUTING -s 192.168.42.0/24 -o wlan0 -j MASQUERADE检查一下 iptables -t nat -S 删除这条规则 iptables -t nat -D POSTROUTING -s 192.168.42.0/24 -o wlan0 -j MASQUERADE
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:
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
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 eth0
or wpl0s0
or something, verifique com ifconfig
o nome apropriado e então root
execute:
% sysctl net.ipv4.ip_forward=1
% iptables -P FORWARD ACCEPT
% iptables -t nat -A POSTROUTING -o outgoing_if -j MASQUERADE
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 via ip_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.conf
que 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.sh
que 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
/etc/dnsmasq.conf
interface=usb0
dhcp-range=192.168.42.2,192.168.42.2,1h
dhcp-option=3
dhcp-option=6
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
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.conf
que 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.sh
que 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
/etc/dnsmasq.conf
interface=usb0
dhcp-range=192.168.42.2,192.168.42.2,1h
dhcp-option=3
dhcp-option=6
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.
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.
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