Looking Openwrt like firmware for IP video cameras

OpenWRT is so awesome and I can't explain how I'm happy that this project exists. I'd like to say thanks for all people who contributed to this project and who helped make it happen.

I’ve been looking to buy security cameras and tried a few different brands, but most weren’t great. I wish there was something like OpenWRT for IP cameras. The chips in modern cameras are pretty good and could maybe be flashed with custom firmware for more features. Has anyone seen any projects like OpenWRT for IP Cameras?

I tried to contact Annke to ask if they can provide sources for the firmware but these as*holes do not want to share. So avoid buying Annke products.

When I was able to SSH into the camera the command list is limited. Here's dmesg not the full output

[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 4.9.129 (root@CI-Frontend-Slave-71-147) (gcc version 6.5.0 (arm_multilib_uclibc_20200924) ) #1 Wed Nov 23 14:31:31 CST 2022
[    0.000000] CPU: ARMv7 Processor  revision 5 
[    0.000000] CPU: div instructions available: patching division code
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] Machine: FH8656
[    0.000000] Ignoring unrecognised tag 0x41000601
[    0.000000] Malformed early option 'dbg'
[    0.000000] Malformed early option 'dbg'
[    0.000000] Memory policy: Data cache writeback
[    0.000000] On node 0 totalpages: 17152
[    0.000000] free_area_init_node: node 0, pgdat c061b428, node_mem_map c4271000
[    0.000000]   Normal zone: 134 pages used for memmap
[    0.000000]   Normal zone: 0 pages reserved
[    0.000000]   Normal zone: 17152 pages, LIFO batch:3
[    0.000000] CPU: All CPU(s) started in SVC mode.
[    0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
[    0.000000] pcpu-alloc: [0] 0 
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 17018
[    0.000000] Kernel command line: console=ttyS0,115200 root=/dev/ram0  KRN_PRT=pri mdio_intf=<NULL> phy_addr=<NULL> mac=bc:5e:33:86:ee:59 rst_flag=0 bld_rev=2661731 flash_type=spinand flash_size=64MB dram_size=128MB devtype=0x25212 chip_id=0x8656 trspt_mode=0x0 burn_mode=0x0 dbg=<NULL> sys_nobackup=1
[    0.000000] PID hash table entries: 512 (order: -1, 2048 bytes)
[    0.000000] Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
[    0.000000] Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
[    0.000000] Memory: 61440K/68608K available (3467K kernel code, 207K rwdata, 888K rodata, 1532K init, 221K bss, 7168K reserved, 0K cma-reserved)
[    0.000000] Virtual kernel memory layout:
[    0.000000]     vector  : 0xffff0000 - 0xffff1000   (   4 kB)
[    0.000000]     fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)
[    0.000000]     vmalloc : 0xc4800000 - 0xff800000   ( 944 MB)
[    0.000000]     lowmem  : 0xc0000000 - 0xc4300000   (  67 MB)
[    0.000000]     modules : 0xbf000000 - 0xc0000000   (  16 MB)
[    0.000000]       .text : 0xc0008000 - 0xc036b098   (3469 kB)
[    0.000000]       .init : 0xc0469000 - 0xc05e8000   (1532 kB)
[    0.000000]       .data : 0xc05e8000 - 0xc061be08   ( 208 kB)
[    0.000000]        .bss : 0xc061be08 - 0xc0653400   ( 222 kB)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] NR_IRQS:16 nr_irqs:16 16
[    0.000000] Switching to timer-based delay loop, resolution 20ns
[    0.000000] clocksource: timer1: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 38225208935 ns
[    0.000006] sched_clock: 32 bits at 50MHz, resolution 20ns, wraps every 42949672950ns
[    0.000123] Console: colour dummy device 80x30
[    0.000152] console [ttyS0] enabled
[    0.000168] Calibrating delay loop (skipped), value calculated using timer frequency.. 1980.82 BogoMIPS (lpj=9904128)
[    0.060062] pid_max: default: 32768 minimum: 301
[    0.060134] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.060141] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.060564] CPU: Testing write buffer coherency: ok
[    0.060760] Setting up static identity map for 0xa0008200 - 0xa0008234
[    0.061778] devtmpfs: initialized
[    0.062723] VFP support v0.3: implementor 41 architecture 2 part 30 variant 7 rev 5
[    0.062815] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[    0.062828] futex hash table entries: 256 (order: -1, 3072 bytes)
[    0.063163] NET: Registered protocol family 16
[    0.063580] DMA: preallocated 256 KiB pool for atomic coherent allocations
[    0.065864] boot_media = 2, hik_flash_size = 0x4000000
[    0.066620] CHIP: FH8656
[    0.070678] fh_axi_dmac fh_axi_dmac.0: FH DMA Controller, 6 channels
[    0.070956] usbcore: registered new interface driver usbfs
[    0.071004] usbcore: registered new interface driver hub
[    0.071049] usbcore: registered new device driver usb
[    0.072317] clocksource: Switched to clocksource timer1
[    0.072516] FS-Cache: Loaded
[    0.077669] NET: Registered protocol family 2
[    0.078210] TCP established hash table entries: 1024 (order: 0, 4096 bytes)
[    0.078227] TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
[    0.078241] TCP: Hash tables configured (established 1024 bind 1024)
[    0.078297] UDP hash table entries: 256 (order: 0, 4096 bytes)
[    0.078311] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
[    0.078410] NET: Registered protocol family 1
[    0.078696] RPC: Registered named UNIX socket transport module.
[    0.078701] RPC: Registered udp transport module.
[    0.078704] RPC: Registered tcp transport module.
[    0.078706] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    1.286042] workingset: timestamp_bits=30 max_order=14 bucket_order=0
[    1.294046] NET: Registered protocol family 38
[    1.294056] Key type asymmetric registered
[    1.294075] io scheduler noop registered
[    1.294222] io scheduler cfq registered (default)
[    1.296833] fh_pwm_probe: clk_rate: 50000000
[    1.296987] PWM driver, Number: 12, IO base addr: 0xc5070000
[    1.298204] Serial: fh serial driver
[    1.298274] ttyS.0: ttyS0 at MMIO 0xf0700000 (irq = 62, base_baud = 1041666) is a ttyS
[    1.298426] fh serial at 0xf0700000, irq 62
[    1.298464] ttyS.2: ttyS2 at MMIO 0xf1300000 (irq = 73, base_baud = 1041666) is a ttyS
[    1.298614] fh serial at 0xf1300000, irq 73
[    1.299458] brd: module loaded
[    1.299902] efuse open mode is 307
[    1.300228] CLK misc driver init successfully
[    1.300799] spi spi0.0: setup: ignoring unsupported mode bits 800
[    1.301929] default get_ecc_status
[    1.301934] SPI-NAND: W25N512GV is found.
[    1.302451] Bad block table found at page 32704, version 0x01
[    1.303287] Bad block table found at page 32640, version 0x01
[    1.303740] mem_size =0x4000000 erease_shift=17 quality_size=0x200 
[    1.303751] no partition for flash quality
[    1.303754] mtd flash quality find_storage_addr failed
[    1.306326] Creating 18 MTD partitions on "spi0.0":
[    1.306341] 0x000000000000-0x000000100000 : "bld"
[    1.307311] 0x000000100000-0x000000180000 : "env"
[    1.308096] 0x000000180000-0x000000200000 : "enc"
[    1.308859] 0x000000200000-0x000000280000 : "sysflg"
[    1.309641] 0x000000280000-0x000000380000 : "dpt"
[    1.310430] 0x000000380000-0x000000880000 : "rcvy"
[    1.311217] 0x000000880000-0x000000d80000 : "sys0"
[    1.312027] 0x000000d80000-0x000000d80000 : "sys1"
[    1.312903] 0x000000d80000-0x000003580000 : "app0"
[    1.313816] 0x000003580000-0x000003580000 : "app1"
[    1.314637] 0x000003580000-0x000003a80000 : "cfg0"
[    1.315464] 0x000003a80000-0x000003f80000 : "cfg1"
[    1.316223] 0x000003f80000-0x000003f80000 : "syslog"
[    1.316993] 0x000003f80000-0x000003f80000 : "dpt1"
[    1.317785] 0x000003f80000-0x000003f80000 : "resv"
[    1.318573] 0x000003f80000-0x000003f80000 : "dat0"
[    1.319372] 0x000003f80000-0x000003f80000 : "dat1"
[    1.320208] 0x000003f80000-0x000003f80000 : "crttable"
[    1.321501] libphy: Fixed MDIO Bus: probed
[    1.321545] GMAC driver:
[    1.321545] 	platform registration... 
[    1.331629] ephy: training data is :f
[    1.332179] fh_gmac fh_gmac.0 eth0: mixed HW and IP checksum settings.
[    1.332352] 	eth0 - (dev. name: fh_gmac - id: 0, IRQ #76
[    1.332352] 		IO base addr: 0xc50c0000)
[    1.342441] ephy: training data is :f
[    1.425937] libphy: gmac_rmii: probed
[    1.425944] found fh internel phy...
[    1.428775] AFE driver [Raw] : [100M] : [10M] = [101f] : [10] : [1f]
[    1.428781] eth0: PHY ID 00441400 at 0 IRQ -1 (0:00) active
[    1.429398] PPP generic driver version 2.4.2
[    1.430691] PPP BSD Compression module registered
[    1.430696] PPP Deflate Compression module registered
[    1.430710] PPP MPPE Compression module registered
[    1.430715] NET: Registered protocol family 24
[    1.486403] fh_usb fh_usb.0: DWC OTG Controller
[    1.486440] fh_usb fh_usb.0: new USB bus registered, assigned bus number 1
[    1.486467] fh_usb fh_usb.0: irq 71, io mem 0x00000000
[    1.486648] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
[    1.486657] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    1.486662] usb usb1: Product: DWC OTG Controller
[    1.486668] usb usb1: Manufacturer: Linux 4.9.129 dwc2_hsotg
[    1.486672] usb usb1: SerialNumber: fh_usb.0
[    1.487122] hub 1-0:1.0: USB hub found
[    1.487153] hub 1-0:1.0: 1 port detected
[    1.487443] usbcore: registered new interface driver cdc_wdm
[    1.533746] random: fast init done
[    1.542406] fh_rtc fh_rtc.0: rtc core: registered fh_rtc as rtc0
[    1.542538] i2c /dev entries driver
[    1.542586] I2C driver:
[    1.542586] 	platform registration... 
[    1.542622] 	tx fifo depth: 16, rx fifo depth: 16
[    1.542809] 	I2C - (dev. name: fh_i2c id: 0, IRQ #43
[    1.542809] 		IO base addr: 0xc50d0000)
[    1.542829] I2C driver:
[    1.542829] 	platform registration... 

I am only aware of one or two cameras (and I cannot recall the brands/models) that are actually supported by OpenWrt. IIRC, they are older devices and can't run a modern version of OpenWrt at this point. Since OpenWrt is primarily targeted as a network infrastructure type firmware -- routers, APs, other network services -- cameras really aren't the target category for the developers.

One option you can always consider is running OpenWrt on a router or x86/SBC device that has a USB port and then use a USB webcam... in that case, OpenWrt can make those cameras available on the network.

But aside from that, it's not really likely you'll find official OpenWrt support on any modern commercial camera devicds. Chances are that you'll need to select a camera system based on other factors.

1 Like

Also be aware that OpenWrt doesn't package many of the video specific packages you would want on a video surveillance camera, getting all those ducks in order (including hardware accelerated encoders, movement detection, light intensity adaption/ IR mode, etc.) would require quite some development on your part. The world has moved quite a bit from MJPEG that ruled the early generations of cameras (some of which had some basic kind of OpenWrt support). Modern cameras also tend to use different, more video specific SOCs than in the older times.

While OpenWrt support for modern gear would be nice, it's not very likely to happen without serious developing work.

1 Like

If you stick to ONVIF cameras, you can stream RTSP from the cameras to a network video recorder (NVR), ideally on its own network (via VLANs or separate NICs). The NVR is something you can build yourself using any x86 mini PC running any software you want, including OpenWrt.

A big advantage of this setup, besides the software compatibility, is access to more powerful hardware for processing the video feeds. Frigate NVR is an open-source example of this hardware paradigm. Note that since the NVR is "just software", you can run other things on it like a file server, etc.

3 Likes

Yeah I know you can do many things with rtsp and there lots of different docker images which perform dump of the stream and you can run many software.
I just happen did not like the original firmware. I'd like to record only when a person in camera.
Annke firmware is far from perfect.
The main reason I started interested in that is that the camera has the CPU which has AI processor it would be great if it could report human and perform recording. to a storage. I tried to configure Annke to record stream to ftp and I could not make it realiably to work.