Repository files navigation

OpenIPC Logo

IP camera hardware checking tool

BuildCI statusGitHub repo sizeGitHub issuesGitHub pull requestsLicense

This basic concept belongs to Maxim Chertov (thank you for your original utility) and Nikita Orlov (for cute YAML format for describing hardware). A warm welcome also to Igor Zalatov (for suggestions for new features and describing ways to do them).


Download

Use the link to download latest build (even directly to your camera). The build uses musl C library to work on vast majority of hardware.

Alternative launch methods

  • Public NFS server (in case your camera firmware includes NFS client support, proven to work on XM cameras):

    $ mount -o nolock 95.217.179.189:/srv/ro /utils/
    $ /utils/ipctool
  • Using telnet/console and uget utility: basically convert small uget binary into echo/printf chunks and deploy to /tmp partition. Read more in documentation

  • TFTP, since some cameras have tftp clients and/or servers by default. Assuming you have the ipctool-mips32 binary ready under /directory/to/serve:

    On a desktop computer:

    $ pip install ptftpd
    $ ptftpd -p 6969 en0 /directory/to/serve
    

    On the camera:

     # tftp -r /directory/to/serve/ipctool-mips32 -g 192.168.1.107 6969
    46% |************** | 61952 0:00:01 ETA
    

Usage

# ipctool -hWhere: -c, --chip-name read chip name -s, --sensor-name read sensor model and control line -t, --temp read chip temperature (where supported) backup <filename> save backup into a file restore [mac|filename] restore from backup (cloud-based or local file) [-s, --skip-env] skip environment [-f, --force] enforce upgrade <bundle> upgrade to OpenIPC firmware (experimental feature, use only on cameras with UART) [-f, --force] enforce printenv drop-in replacement for fw_printenv setenv <key> <value> drop-in replacement for fw_setenv dmesg drop-in replacement for dmesg i2cget <device address> <register> spiget <register> read data from I2C/SPI device i2cset <device address> <register> <new value> spiset <register> <new value> write a value to I2C/SPI device i2cdump [--script] <device address> <from register> <to register> spidump [--script] <from register> <to register> dump data from I2C/SPI device reginfo [--script] dump current status of pinmux registers gpio (scan|mux) GPIO utilities trace [--skip=usleep] <full/path/to/executable> [program arguments] dump original firmware calls and data structures -h, --help this help

When run without parameters utility produces YAML with all hardware-specific information about given IP-camera or DVR:

---
board:
vendor: Xiongmaimodel: 50H20LcloudId: 3beae2b40d84f889chip:
vendor: HiSiliconmodel: 3516CV300ethernet:
mac: "00:12:89:12:88:e1"u-mdio-phyaddr: 1phy-id: 0x001cc816d-mdio-phyaddr: 0rom:
- type: norblock: 64Kchip:
name: "w25q128"id: 0xef4018partitions:
- name: bootsize: 0x30000sha1: 7a7a83e9contains:
- name: xmcryptooffset: 0x1fc00
- name: uboot-envoffset: 0x20000
- name: romfssize: 0x2e0000path: /,squashfssha1: 62529dab
- name: usersize: 0x300000path: /usr,squashfssha1: cbb7e9ca
- name: websize: 0x160000path: /mnt/custom/data/Fonts,squashfssha1: 48140b3b
- name: customsize: 0x40000path: /mnt/custom,cramfssha1: fb72a5f5
- name: mtdsize: 0x50000path: /mnt/mtd,jffs2,rwsize: 8Maddr-mode: 3-byteram:
total: 128Mmedia: 72Mfirmware:
u-boot: "2010.06-svn1098 (Jun 11 2018 - 13:17:42)"kernel: "3.18.20 (Thu Jul 5 14:44:19 CST 2018)"toolchain: gcc version 4.9.4 20150629 (prerelease) (Hisilicon_v500_20170922) libc: uClibc 0.9.33.2sdk: "Hi3516CV300_MPP_V1.0.0.0 B010 Release (Jun 22 2018, 19:22:22)"main-app: /usr/bin/Sofiasensors:
- vendor: Sonymodel: IMX291control:
bus: 0type: i2caddr: 0x34params:
bitness: 12databus: LVDS 4 chfps: 30data:
type: LVDSlane-id:
- 0
- 1
- 2
- 3lvds-wdr-en: 0lvds-wdr-mode: 0lvds-wdr-num: 0raw-data-type: RAW_DATA_12BITsync-mode: LVDS_SYNC_MODE_SAVdata-endian: LVDS_ENDIAN_BIGsync-code-endian: LVDS_ENDIAN_BIGsync-code:
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0clock: 37.125MHz

In your own scripts

  • Determine chip name:

    # ipctool --chip-namehi3516cv300
  • Determine sensor model and control line:

    # ipctool --sensor-nameimx291_i2c
  • Get temperature from chip's internal sensor (not all devices supported):

    # ipctool --temp50.69

As backup/restore tool

  • Save full backup with YAML metadata into specific file:

    # mount -o nolock mynfsserver:/srv /var/utils
    # ipctool backup /var/utils/mybackup-00:12:17:83:d6:39
    # sync

As reverse engineering tool

  • Drop-in replacement of dmesg command:

    # ipctool dmesg
  • Drop-in replacement of fw_printenv and fw_setenv commands:

    # ipctool printenv | grep bootargs
    # ipctool setenv bootargs "mem=\${osmem} mtdparts=hi_sfc:256k(boot),64k(env),2048k(kernel),5120k(rootfs),-(rootfs_data)"
  • Drop-in replacement of i2cget, i2cset and i2cdump commands from i2c-tools package:

    # ipctool i2cget 0x34 0x3000
    # ipctool i2cset 0x34 0x3000 1
    # ipctool i2cdump 0x34 0x3000 0x31ff
    # ipctool i2cdump --script 0x34 0x3000 0x31ff
  • The same approach is to manipulate SPI sensor registers:

    # ipctool spiget 0x200
    # ipctool spiset 0x200 1
    # ipctool spidump 0x200 0x300
    # ipctool spidump --script 0x200 0x300
  • Dump the state of pinmux registers in human- and machine-readable format or shell script ready to be applied on another system:

    # ipctool reginfo
    # ipctool --script reginfo
  • Advanced replacement of strace:

    # ipctool trace /usr/bin/Sofia

Supported SoCs

Tested on:

ManufacturerModels
HiSiliconHi3516CV100/200/300, Hi3516EV100/200/300, Hi3516DV300, Hi3518EV100
SigmaStarSSC335
XiongmaiXM510, XM530, XM550
RockchipRV1109

Please test on your device to help us extend the list.

Supported boards

Tested on:

ManufacturerModels
XiongmaiVarious models
HankvisionV6202IR-IMX327
RuisionRS-H649F-A0, RS-H651JAI-AO, RS-H656S-AO
TP-LinkNC210

Supported sensors

Tested on:

ManufacturerModels
Silicon Optronics, Inc.JX-F22, JX-F23, JX-F37, JX-H62, JX-H65, JX-K05
SonyIMX224, IMX290, IMX291, IMX307, IMX322, IMX323, IMX327, IMX335, IMX415
ON SemiconductorAR0130, AR0237
SmartSensSC2135, SC2232, SC2235, SC2235P, SC2239, SC2315e (SC307E, SC4239Р), SC335E (SC5300)
OmniVisionOV9712
GalaxyCoreGC2053

Please test on your device to help us extend the list.


Support

OpenIPC offers two levels of support.

  • Free support through the community (via chat).
  • Paid commercial support (from the team of developers).

Please consider subscribing for paid commercial support if you intend to use our product for business. As a paid customer, you will get technical support and maintenance services directly from our skilled team. Your bug reports and feature requests will get prioritized attention and expedited solutions. It's a win-win strategy for both parties, that would contribute to the stability your business, and help core developers to work on the project full-time.

If you have any specific questions concerning our project, feel free to contact us.

Participating and Contribution

If you like what we do, and willing to intensify the development, please consider participating.

You can improve existing code and send us patches. You can add new features missing from our code.

You can help us to write a better documentation, proofread and correct our websites.

You can just donate some money to cover the cost of development and long-term maintaining of what we believe is going to be the most stable, flexible, and open IP Network Camera Framework for users like yourself.

You can make a financial contribution to the project at Open Collective.

Thank you.

Open Collective donate button

About

Simple tool (and library) for checking IP camera hardware

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

OpenIPC Logo

IP camera hardware checking tool

BuildCI statusGitHub repo sizeGitHub issuesGitHub pull requestsLicense

This basic concept belongs to Maxim Chertov (thank you for your original utility) and Nikita Orlov (for cute YAML format for describing hardware). A warm welcome also to Igor Zalatov (for suggestions for new features and describing ways to do them).


Download

Use the link to download latest build (even directly to your camera). The build uses musl C library to work on vast majority of hardware.

Alternative launch methods

  • Public NFS server (in case your camera firmware includes NFS client support, proven to work on XM cameras):

    $ mount -o nolock 95.217.179.189:/srv/ro /utils/
    $ /utils/ipctool
  • Using telnet/console and uget utility: basically convert small uget binary into echo/printf chunks and deploy to /tmp partition. Read more in documentation

  • TFTP, since some cameras have tftp clients and/or servers by default. Assuming you have the ipctool-mips32 binary ready under /directory/to/serve:

    On a desktop computer:

    $ pip install ptftpd
    $ ptftpd -p 6969 en0 /directory/to/serve
    

    On the camera:

     # tftp -r /directory/to/serve/ipctool-mips32 -g 192.168.1.107 6969
    46% |************** | 61952 0:00:01 ETA
    

Usage

# ipctool -hWhere: -c, --chip-name read chip name -s, --sensor-name read sensor model and control line -t, --temp read chip temperature (where supported) backup <filename> save backup into a file restore [mac|filename] restore from backup (cloud-based or local file) [-s, --skip-env] skip environment [-f, --force] enforce upgrade <bundle> upgrade to OpenIPC firmware (experimental feature, use only on cameras with UART) [-f, --force] enforce printenv drop-in replacement for fw_printenv setenv <key> <value> drop-in replacement for fw_setenv dmesg drop-in replacement for dmesg i2cget <device address> <register> spiget <register> read data from I2C/SPI device i2cset <device address> <register> <new value> spiset <register> <new value> write a value to I2C/SPI device i2cdump [--script] <device address> <from register> <to register> spidump [--script] <from register> <to register> dump data from I2C/SPI device reginfo [--script] dump current status of pinmux registers gpio (scan|mux) GPIO utilities trace [--skip=usleep] <full/path/to/executable> [program arguments] dump original firmware calls and data structures -h, --help this help

When run without parameters utility produces YAML with all hardware-specific information about given IP-camera or DVR:

---
board:
vendor: Xiongmaimodel: 50H20LcloudId: 3beae2b40d84f889chip:
vendor: HiSiliconmodel: 3516CV300ethernet:
mac: "00:12:89:12:88:e1"u-mdio-phyaddr: 1phy-id: 0x001cc816d-mdio-phyaddr: 0rom:
- type: norblock: 64Kchip:
name: "w25q128"id: 0xef4018partitions:
- name: bootsize: 0x30000sha1: 7a7a83e9contains:
- name: xmcryptooffset: 0x1fc00
- name: uboot-envoffset: 0x20000
- name: romfssize: 0x2e0000path: /,squashfssha1: 62529dab
- name: usersize: 0x300000path: /usr,squashfssha1: cbb7e9ca
- name: websize: 0x160000path: /mnt/custom/data/Fonts,squashfssha1: 48140b3b
- name: customsize: 0x40000path: /mnt/custom,cramfssha1: fb72a5f5
- name: mtdsize: 0x50000path: /mnt/mtd,jffs2,rwsize: 8Maddr-mode: 3-byteram:
total: 128Mmedia: 72Mfirmware:
u-boot: "2010.06-svn1098 (Jun 11 2018 - 13:17:42)"kernel: "3.18.20 (Thu Jul 5 14:44:19 CST 2018)"toolchain: gcc version 4.9.4 20150629 (prerelease) (Hisilicon_v500_20170922) libc: uClibc 0.9.33.2sdk: "Hi3516CV300_MPP_V1.0.0.0 B010 Release (Jun 22 2018, 19:22:22)"main-app: /usr/bin/Sofiasensors:
- vendor: Sonymodel: IMX291control:
bus: 0type: i2caddr: 0x34params:
bitness: 12databus: LVDS 4 chfps: 30data:
type: LVDSlane-id:
- 0
- 1
- 2
- 3lvds-wdr-en: 0lvds-wdr-mode: 0lvds-wdr-num: 0raw-data-type: RAW_DATA_12BITsync-mode: LVDS_SYNC_MODE_SAVdata-endian: LVDS_ENDIAN_BIGsync-code-endian: LVDS_ENDIAN_BIGsync-code:
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0clock: 37.125MHz

In your own scripts

  • Determine chip name:

    # ipctool --chip-namehi3516cv300
  • Determine sensor model and control line:

    # ipctool --sensor-nameimx291_i2c
  • Get temperature from chip's internal sensor (not all devices supported):

    # ipctool --temp50.69

As backup/restore tool

  • Save full backup with YAML metadata into specific file:

    # mount -o nolock mynfsserver:/srv /var/utils
    # ipctool backup /var/utils/mybackup-00:12:17:83:d6:39
    # sync

As reverse engineering tool

  • Drop-in replacement of dmesg command:

    # ipctool dmesg
  • Drop-in replacement of fw_printenv and fw_setenv commands:

    # ipctool printenv | grep bootargs
    # ipctool setenv bootargs "mem=\${osmem} mtdparts=hi_sfc:256k(boot),64k(env),2048k(kernel),5120k(rootfs),-(rootfs_data)"
  • Drop-in replacement of i2cget, i2cset and i2cdump commands from i2c-tools package:

    # ipctool i2cget 0x34 0x3000
    # ipctool i2cset 0x34 0x3000 1
    # ipctool i2cdump 0x34 0x3000 0x31ff
    # ipctool i2cdump --script 0x34 0x3000 0x31ff
  • The same approach is to manipulate SPI sensor registers:

    # ipctool spiget 0x200
    # ipctool spiset 0x200 1
    # ipctool spidump 0x200 0x300
    # ipctool spidump --script 0x200 0x300
  • Dump the state of pinmux registers in human- and machine-readable format or shell script ready to be applied on another system:

    # ipctool reginfo
    # ipctool --script reginfo
  • Advanced replacement of strace:

    # ipctool trace /usr/bin/Sofia

Supported SoCs

Tested on:

ManufacturerModels
HiSiliconHi3516CV100/200/300, Hi3516EV100/200/300, Hi3516DV300, Hi3518EV100
SigmaStarSSC335
XiongmaiXM510, XM530, XM550
RockchipRV1109

Please test on your device to help us extend the list.

Supported boards

Tested on:

ManufacturerModels
XiongmaiVarious models
HankvisionV6202IR-IMX327
RuisionRS-H649F-A0, RS-H651JAI-AO, RS-H656S-AO
TP-LinkNC210

Supported sensors

Tested on:

ManufacturerModels
Silicon Optronics, Inc.JX-F22, JX-F23, JX-F37, JX-H62, JX-H65, JX-K05
SonyIMX224, IMX290, IMX291, IMX307, IMX322, IMX323, IMX327, IMX335, IMX415
ON SemiconductorAR0130, AR0237
SmartSensSC2135, SC2232, SC2235, SC2235P, SC2239, SC2315e (SC307E, SC4239Р), SC335E (SC5300)
OmniVisionOV9712
GalaxyCoreGC2053

Please test on your device to help us extend the list.


Support

OpenIPC offers two levels of support.

  • Free support through the community (via chat).
  • Paid commercial support (from the team of developers).

Please consider subscribing for paid commercial support if you intend to use our product for business. As a paid customer, you will get technical support and maintenance services directly from our skilled team. Your bug reports and feature requests will get prioritized attention and expedited solutions. It's a win-win strategy for both parties, that would contribute to the stability your business, and help core developers to work on the project full-time.

If you have any specific questions concerning our project, feel free to contact us.

Participating and Contribution

If you like what we do, and willing to intensify the development, please consider participating.

You can improve existing code and send us patches. You can add new features missing from our code.

You can help us to write a better documentation, proofread and correct our websites.

You can just donate some money to cover the cost of development and long-term maintaining of what we believe is going to be the most stable, flexible, and open IP Network Camera Framework for users like yourself.

You can make a financial contribution to the project at Open Collective.

Thank you.

Open Collective donate button

About

Simple tool (and library) for checking IP camera hardware

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OpenIPC Logo

IP camera hardware checking tool

BuildCI statusGitHub repo sizeGitHub issuesGitHub pull requestsLicense

This basic concept belongs to Maxim Chertov (thank you for your original utility) and Nikita Orlov (for cute YAML format for describing hardware). A warm welcome also to Igor Zalatov (for suggestions for new features and describing ways to do them).


Download

Use the link to download latest build (even directly to your camera). The build uses musl C library to work on vast majority of hardware.

Alternative launch methods

  • Public NFS server (in case your camera firmware includes NFS client support, proven to work on XM cameras):

    $ mount -o nolock 95.217.179.189:/srv/ro /utils/
    $ /utils/ipctool
  • Using telnet/console and uget utility: basically convert small uget binary into echo/printf chunks and deploy to /tmp partition. Read more in documentation

  • TFTP, since some cameras have tftp clients and/or servers by default. Assuming you have the ipctool-mips32 binary ready under /directory/to/serve:

    On a desktop computer:

    $ pip install ptftpd
    $ ptftpd -p 6969 en0 /directory/to/serve
    

    On the camera:

     # tftp -r /directory/to/serve/ipctool-mips32 -g 192.168.1.107 6969
    46% |************** | 61952 0:00:01 ETA
    

Usage

# ipctool -hWhere: -c, --chip-name read chip name -s, --sensor-name read sensor model and control line -t, --temp read chip temperature (where supported) backup <filename> save backup into a file restore [mac|filename] restore from backup (cloud-based or local file) [-s, --skip-env] skip environment [-f, --force] enforce upgrade <bundle> upgrade to OpenIPC firmware (experimental feature, use only on cameras with UART) [-f, --force] enforce printenv drop-in replacement for fw_printenv setenv <key> <value> drop-in replacement for fw_setenv dmesg drop-in replacement for dmesg i2cget <device address> <register> spiget <register> read data from I2C/SPI device i2cset <device address> <register> <new value> spiset <register> <new value> write a value to I2C/SPI device i2cdump [--script] <device address> <from register> <to register> spidump [--script] <from register> <to register> dump data from I2C/SPI device reginfo [--script] dump current status of pinmux registers gpio (scan|mux) GPIO utilities trace [--skip=usleep] <full/path/to/executable> [program arguments] dump original firmware calls and data structures -h, --help this help

When run without parameters utility produces YAML with all hardware-specific information about given IP-camera or DVR:

---
board:
vendor: Xiongmaimodel: 50H20LcloudId: 3beae2b40d84f889chip:
vendor: HiSiliconmodel: 3516CV300ethernet:
mac: "00:12:89:12:88:e1"u-mdio-phyaddr: 1phy-id: 0x001cc816d-mdio-phyaddr: 0rom:
- type: norblock: 64Kchip:
name: "w25q128"id: 0xef4018partitions:
- name: bootsize: 0x30000sha1: 7a7a83e9contains:
- name: xmcryptooffset: 0x1fc00
- name: uboot-envoffset: 0x20000
- name: romfssize: 0x2e0000path: /,squashfssha1: 62529dab
- name: usersize: 0x300000path: /usr,squashfssha1: cbb7e9ca
- name: websize: 0x160000path: /mnt/custom/data/Fonts,squashfssha1: 48140b3b
- name: customsize: 0x40000path: /mnt/custom,cramfssha1: fb72a5f5
- name: mtdsize: 0x50000path: /mnt/mtd,jffs2,rwsize: 8Maddr-mode: 3-byteram:
total: 128Mmedia: 72Mfirmware:
u-boot: "2010.06-svn1098 (Jun 11 2018 - 13:17:42)"kernel: "3.18.20 (Thu Jul 5 14:44:19 CST 2018)"toolchain: gcc version 4.9.4 20150629 (prerelease) (Hisilicon_v500_20170922) libc: uClibc 0.9.33.2sdk: "Hi3516CV300_MPP_V1.0.0.0 B010 Release (Jun 22 2018, 19:22:22)"main-app: /usr/bin/Sofiasensors:
- vendor: Sonymodel: IMX291control:
bus: 0type: i2caddr: 0x34params:
bitness: 12databus: LVDS 4 chfps: 30data:
type: LVDSlane-id:
- 0
- 1
- 2
- 3lvds-wdr-en: 0lvds-wdr-mode: 0lvds-wdr-num: 0raw-data-type: RAW_DATA_12BITsync-mode: LVDS_SYNC_MODE_SAVdata-endian: LVDS_ENDIAN_BIGsync-code-endian: LVDS_ENDIAN_BIGsync-code:
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0clock: 37.125MHz

In your own scripts

  • Determine chip name:

    # ipctool --chip-namehi3516cv300
  • Determine sensor model and control line:

    # ipctool --sensor-nameimx291_i2c
  • Get temperature from chip's internal sensor (not all devices supported):

    # ipctool --temp50.69

As backup/restore tool

  • Save full backup with YAML metadata into specific file:

    # mount -o nolock mynfsserver:/srv /var/utils
    # ipctool backup /var/utils/mybackup-00:12:17:83:d6:39
    # sync

As reverse engineering tool

  • Drop-in replacement of dmesg command:

    # ipctool dmesg
  • Drop-in replacement of fw_printenv and fw_setenv commands:

    # ipctool printenv | grep bootargs
    # ipctool setenv bootargs "mem=\${osmem} mtdparts=hi_sfc:256k(boot),64k(env),2048k(kernel),5120k(rootfs),-(rootfs_data)"
  • Drop-in replacement of i2cget, i2cset and i2cdump commands from i2c-tools package:

    # ipctool i2cget 0x34 0x3000
    # ipctool i2cset 0x34 0x3000 1
    # ipctool i2cdump 0x34 0x3000 0x31ff
    # ipctool i2cdump --script 0x34 0x3000 0x31ff
  • The same approach is to manipulate SPI sensor registers:

    # ipctool spiget 0x200
    # ipctool spiset 0x200 1
    # ipctool spidump 0x200 0x300
    # ipctool spidump --script 0x200 0x300
  • Dump the state of pinmux registers in human- and machine-readable format or shell script ready to be applied on another system:

    # ipctool reginfo
    # ipctool --script reginfo
  • Advanced replacement of strace:

    # ipctool trace /usr/bin/Sofia

Supported SoCs

Tested on:

ManufacturerModels
HiSiliconHi3516CV100/200/300, Hi3516EV100/200/300, Hi3516DV300, Hi3518EV100
SigmaStarSSC335
XiongmaiXM510, XM530, XM550
RockchipRV1109

Please test on your device to help us extend the list.

Supported boards

Tested on:

ManufacturerModels
XiongmaiVarious models
HankvisionV6202IR-IMX327
RuisionRS-H649F-A0, RS-H651JAI-AO, RS-H656S-AO
TP-LinkNC210

Supported sensors

Tested on:

ManufacturerModels
Silicon Optronics, Inc.JX-F22, JX-F23, JX-F37, JX-H62, JX-H65, JX-K05
SonyIMX224, IMX290, IMX291, IMX307, IMX322, IMX323, IMX327, IMX335, IMX415
ON SemiconductorAR0130, AR0237
SmartSensSC2135, SC2232, SC2235, SC2235P, SC2239, SC2315e (SC307E, SC4239Р), SC335E (SC5300)
OmniVisionOV9712
GalaxyCoreGC2053

Please test on your device to help us extend the list.


Support

OpenIPC offers two levels of support.

  • Free support through the community (via chat).
  • Paid commercial support (from the team of developers).

Please consider subscribing for paid commercial support if you intend to use our product for business. As a paid customer, you will get technical support and maintenance services directly from our skilled team. Your bug reports and feature requests will get prioritized attention and expedited solutions. It's a win-win strategy for both parties, that would contribute to the stability your business, and help core developers to work on the project full-time.

If you have any specific questions concerning our project, feel free to contact us.

Participating and Contribution

If you like what we do, and willing to intensify the development, please consider participating.

You can improve existing code and send us patches. You can add new features missing from our code.

You can help us to write a better documentation, proofread and correct our websites.

You can just donate some money to cover the cost of development and long-term maintaining of what we believe is going to be the most stable, flexible, and open IP Network Camera Framework for users like yourself.

You can make a financial contribution to the project at Open Collective.

Thank you.

Open Collective donate button

About

Simple tool (and library) for checking IP camera hardware

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OpenIPC Logo

IP camera hardware checking tool

BuildCI statusGitHub repo sizeGitHub issuesGitHub pull requestsLicense

This basic concept belongs to Maxim Chertov (thank you for your original utility) and Nikita Orlov (for cute YAML format for describing hardware). A warm welcome also to Igor Zalatov (for suggestions for new features and describing ways to do them).


Download

Use the link to download latest build (even directly to your camera). The build uses musl C library to work on vast majority of hardware.

Alternative launch methods

  • Public NFS server (in case your camera firmware includes NFS client support, proven to work on XM cameras):

    $ mount -o nolock 95.217.179.189:/srv/ro /utils/
    $ /utils/ipctool
  • Using telnet/console and uget utility: basically convert small uget binary into echo/printf chunks and deploy to /tmp partition. Read more in documentation

  • TFTP, since some cameras have tftp clients and/or servers by default. Assuming you have the ipctool-mips32 binary ready under /directory/to/serve:

    On a desktop computer:

    $ pip install ptftpd
    $ ptftpd -p 6969 en0 /directory/to/serve
    

    On the camera:

     # tftp -r /directory/to/serve/ipctool-mips32 -g 192.168.1.107 6969
    46% |************** | 61952 0:00:01 ETA
    

Usage

# ipctool -hWhere: -c, --chip-name read chip name -s, --sensor-name read sensor model and control line -t, --temp read chip temperature (where supported) backup <filename> save backup into a file restore [mac|filename] restore from backup (cloud-based or local file) [-s, --skip-env] skip environment [-f, --force] enforce upgrade <bundle> upgrade to OpenIPC firmware (experimental feature, use only on cameras with UART) [-f, --force] enforce printenv drop-in replacement for fw_printenv setenv <key> <value> drop-in replacement for fw_setenv dmesg drop-in replacement for dmesg i2cget <device address> <register> spiget <register> read data from I2C/SPI device i2cset <device address> <register> <new value> spiset <register> <new value> write a value to I2C/SPI device i2cdump [--script] <device address> <from register> <to register> spidump [--script] <from register> <to register> dump data from I2C/SPI device reginfo [--script] dump current status of pinmux registers gpio (scan|mux) GPIO utilities trace [--skip=usleep] <full/path/to/executable> [program arguments] dump original firmware calls and data structures -h, --help this help

When run without parameters utility produces YAML with all hardware-specific information about given IP-camera or DVR:

---
board:
vendor: Xiongmaimodel: 50H20LcloudId: 3beae2b40d84f889chip:
vendor: HiSiliconmodel: 3516CV300ethernet:
mac: "00:12:89:12:88:e1"u-mdio-phyaddr: 1phy-id: 0x001cc816d-mdio-phyaddr: 0rom:
- type: norblock: 64Kchip:
name: "w25q128"id: 0xef4018partitions:
- name: bootsize: 0x30000sha1: 7a7a83e9contains:
- name: xmcryptooffset: 0x1fc00
- name: uboot-envoffset: 0x20000
- name: romfssize: 0x2e0000path: /,squashfssha1: 62529dab
- name: usersize: 0x300000path: /usr,squashfssha1: cbb7e9ca
- name: websize: 0x160000path: /mnt/custom/data/Fonts,squashfssha1: 48140b3b
- name: customsize: 0x40000path: /mnt/custom,cramfssha1: fb72a5f5
- name: mtdsize: 0x50000path: /mnt/mtd,jffs2,rwsize: 8Maddr-mode: 3-byteram:
total: 128Mmedia: 72Mfirmware:
u-boot: "2010.06-svn1098 (Jun 11 2018 - 13:17:42)"kernel: "3.18.20 (Thu Jul 5 14:44:19 CST 2018)"toolchain: gcc version 4.9.4 20150629 (prerelease) (Hisilicon_v500_20170922) libc: uClibc 0.9.33.2sdk: "Hi3516CV300_MPP_V1.0.0.0 B010 Release (Jun 22 2018, 19:22:22)"main-app: /usr/bin/Sofiasensors:
- vendor: Sonymodel: IMX291control:
bus: 0type: i2caddr: 0x34params:
bitness: 12databus: LVDS 4 chfps: 30data:
type: LVDSlane-id:
- 0
- 1
- 2
- 3lvds-wdr-en: 0lvds-wdr-mode: 0lvds-wdr-num: 0raw-data-type: RAW_DATA_12BITsync-mode: LVDS_SYNC_MODE_SAVdata-endian: LVDS_ENDIAN_BIGsync-code-endian: LVDS_ENDIAN_BIGsync-code:
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0clock: 37.125MHz

In your own scripts

  • Determine chip name:

    # ipctool --chip-namehi3516cv300
  • Determine sensor model and control line:

    # ipctool --sensor-nameimx291_i2c
  • Get temperature from chip's internal sensor (not all devices supported):

    # ipctool --temp50.69

As backup/restore tool

  • Save full backup with YAML metadata into specific file:

    # mount -o nolock mynfsserver:/srv /var/utils
    # ipctool backup /var/utils/mybackup-00:12:17:83:d6:39
    # sync

As reverse engineering tool

  • Drop-in replacement of dmesg command:

    # ipctool dmesg
  • Drop-in replacement of fw_printenv and fw_setenv commands:

    # ipctool printenv | grep bootargs
    # ipctool setenv bootargs "mem=\${osmem} mtdparts=hi_sfc:256k(boot),64k(env),2048k(kernel),5120k(rootfs),-(rootfs_data)"
  • Drop-in replacement of i2cget, i2cset and i2cdump commands from i2c-tools package:

    # ipctool i2cget 0x34 0x3000
    # ipctool i2cset 0x34 0x3000 1
    # ipctool i2cdump 0x34 0x3000 0x31ff
    # ipctool i2cdump --script 0x34 0x3000 0x31ff
  • The same approach is to manipulate SPI sensor registers:

    # ipctool spiget 0x200
    # ipctool spiset 0x200 1
    # ipctool spidump 0x200 0x300
    # ipctool spidump --script 0x200 0x300
  • Dump the state of pinmux registers in human- and machine-readable format or shell script ready to be applied on another system:

    # ipctool reginfo
    # ipctool --script reginfo
  • Advanced replacement of strace:

    # ipctool trace /usr/bin/Sofia

Supported SoCs

Tested on:

ManufacturerModels
HiSiliconHi3516CV100/200/300, Hi3516EV100/200/300, Hi3516DV300, Hi3518EV100
SigmaStarSSC335
XiongmaiXM510, XM530, XM550
RockchipRV1109

Please test on your device to help us extend the list.

Supported boards

Tested on:

ManufacturerModels
XiongmaiVarious models
HankvisionV6202IR-IMX327
RuisionRS-H649F-A0, RS-H651JAI-AO, RS-H656S-AO
TP-LinkNC210

Supported sensors

Tested on:

ManufacturerModels
Silicon Optronics, Inc.JX-F22, JX-F23, JX-F37, JX-H62, JX-H65, JX-K05
SonyIMX224, IMX290, IMX291, IMX307, IMX322, IMX323, IMX327, IMX335, IMX415
ON SemiconductorAR0130, AR0237
SmartSensSC2135, SC2232, SC2235, SC2235P, SC2239, SC2315e (SC307E, SC4239Р), SC335E (SC5300)
OmniVisionOV9712
GalaxyCoreGC2053

Please test on your device to help us extend the list.


Support

OpenIPC offers two levels of support.

  • Free support through the community (via chat).
  • Paid commercial support (from the team of developers).

Please consider subscribing for paid commercial support if you intend to use our product for business. As a paid customer, you will get technical support and maintenance services directly from our skilled team. Your bug reports and feature requests will get prioritized attention and expedited solutions. It's a win-win strategy for both parties, that would contribute to the stability your business, and help core developers to work on the project full-time.

If you have any specific questions concerning our project, feel free to contact us.

Participating and Contribution

If you like what we do, and willing to intensify the development, please consider participating.

You can improve existing code and send us patches. You can add new features missing from our code.

You can help us to write a better documentation, proofread and correct our websites.

You can just donate some money to cover the cost of development and long-term maintaining of what we believe is going to be the most stable, flexible, and open IP Network Camera Framework for users like yourself.

You can make a financial contribution to the project at Open Collective.

Thank you.

Open Collective donate button

About

Simple tool (and library) for checking IP camera hardware

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

OpenIPC Logo

IP camera hardware checking tool

BuildCI statusGitHub repo sizeGitHub issuesGitHub pull requestsLicense

This basic concept belongs to Maxim Chertov (thank you for your original utility) and Nikita Orlov (for cute YAML format for describing hardware). A warm welcome also to Igor Zalatov (for suggestions for new features and describing ways to do them).


Download

Use the link to download latest build (even directly to your camera). The build uses musl C library to work on vast majority of hardware.

Alternative launch methods

  • Public NFS server (in case your camera firmware includes NFS client support, proven to work on XM cameras):

    $ mount -o nolock 95.217.179.189:/srv/ro /utils/
    $ /utils/ipctool
  • Using telnet/console and uget utility: basically convert small uget binary into echo/printf chunks and deploy to /tmp partition. Read more in documentation

  • TFTP, since some cameras have tftp clients and/or servers by default. Assuming you have the ipctool-mips32 binary ready under /directory/to/serve:

    On a desktop computer:

    $ pip install ptftpd
    $ ptftpd -p 6969 en0 /directory/to/serve
    

    On the camera:

     # tftp -r /directory/to/serve/ipctool-mips32 -g 192.168.1.107 6969
    46% |************** | 61952 0:00:01 ETA
    

Usage

# ipctool -hWhere: -c, --chip-name read chip name -s, --sensor-name read sensor model and control line -t, --temp read chip temperature (where supported) backup <filename> save backup into a file restore [mac|filename] restore from backup (cloud-based or local file) [-s, --skip-env] skip environment [-f, --force] enforce upgrade <bundle> upgrade to OpenIPC firmware (experimental feature, use only on cameras with UART) [-f, --force] enforce printenv drop-in replacement for fw_printenv setenv <key> <value> drop-in replacement for fw_setenv dmesg drop-in replacement for dmesg i2cget <device address> <register> spiget <register> read data from I2C/SPI device i2cset <device address> <register> <new value> spiset <register> <new value> write a value to I2C/SPI device i2cdump [--script] <device address> <from register> <to register> spidump [--script] <from register> <to register> dump data from I2C/SPI device reginfo [--script] dump current status of pinmux registers gpio (scan|mux) GPIO utilities trace [--skip=usleep] <full/path/to/executable> [program arguments] dump original firmware calls and data structures -h, --help this help

When run without parameters utility produces YAML with all hardware-specific information about given IP-camera or DVR:

---
board:
vendor: Xiongmaimodel: 50H20LcloudId: 3beae2b40d84f889chip:
vendor: HiSiliconmodel: 3516CV300ethernet:
mac: "00:12:89:12:88:e1"u-mdio-phyaddr: 1phy-id: 0x001cc816d-mdio-phyaddr: 0rom:
- type: norblock: 64Kchip:
name: "w25q128"id: 0xef4018partitions:
- name: bootsize: 0x30000sha1: 7a7a83e9contains:
- name: xmcryptooffset: 0x1fc00
- name: uboot-envoffset: 0x20000
- name: romfssize: 0x2e0000path: /,squashfssha1: 62529dab
- name: usersize: 0x300000path: /usr,squashfssha1: cbb7e9ca
- name: websize: 0x160000path: /mnt/custom/data/Fonts,squashfssha1: 48140b3b
- name: customsize: 0x40000path: /mnt/custom,cramfssha1: fb72a5f5
- name: mtdsize: 0x50000path: /mnt/mtd,jffs2,rwsize: 8Maddr-mode: 3-byteram:
total: 128Mmedia: 72Mfirmware:
u-boot: "2010.06-svn1098 (Jun 11 2018 - 13:17:42)"kernel: "3.18.20 (Thu Jul 5 14:44:19 CST 2018)"toolchain: gcc version 4.9.4 20150629 (prerelease) (Hisilicon_v500_20170922) libc: uClibc 0.9.33.2sdk: "Hi3516CV300_MPP_V1.0.0.0 B010 Release (Jun 22 2018, 19:22:22)"main-app: /usr/bin/Sofiasensors:
- vendor: Sonymodel: IMX291control:
bus: 0type: i2caddr: 0x34params:
bitness: 12databus: LVDS 4 chfps: 30data:
type: LVDSlane-id:
- 0
- 1
- 2
- 3lvds-wdr-en: 0lvds-wdr-mode: 0lvds-wdr-num: 0raw-data-type: RAW_DATA_12BITsync-mode: LVDS_SYNC_MODE_SAVdata-endian: LVDS_ENDIAN_BIGsync-code-endian: LVDS_ENDIAN_BIGsync-code:
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0clock: 37.125MHz

In your own scripts

  • Determine chip name:

    # ipctool --chip-namehi3516cv300
  • Determine sensor model and control line:

    # ipctool --sensor-nameimx291_i2c
  • Get temperature from chip's internal sensor (not all devices supported):

    # ipctool --temp50.69

As backup/restore tool

  • Save full backup with YAML metadata into specific file:

    # mount -o nolock mynfsserver:/srv /var/utils
    # ipctool backup /var/utils/mybackup-00:12:17:83:d6:39
    # sync

As reverse engineering tool

  • Drop-in replacement of dmesg command:

    # ipctool dmesg
  • Drop-in replacement of fw_printenv and fw_setenv commands:

    # ipctool printenv | grep bootargs
    # ipctool setenv bootargs "mem=\${osmem} mtdparts=hi_sfc:256k(boot),64k(env),2048k(kernel),5120k(rootfs),-(rootfs_data)"
  • Drop-in replacement of i2cget, i2cset and i2cdump commands from i2c-tools package:

    # ipctool i2cget 0x34 0x3000
    # ipctool i2cset 0x34 0x3000 1
    # ipctool i2cdump 0x34 0x3000 0x31ff
    # ipctool i2cdump --script 0x34 0x3000 0x31ff
  • The same approach is to manipulate SPI sensor registers:

    # ipctool spiget 0x200
    # ipctool spiset 0x200 1
    # ipctool spidump 0x200 0x300
    # ipctool spidump --script 0x200 0x300
  • Dump the state of pinmux registers in human- and machine-readable format or shell script ready to be applied on another system:

    # ipctool reginfo
    # ipctool --script reginfo
  • Advanced replacement of strace:

    # ipctool trace /usr/bin/Sofia

Supported SoCs

Tested on:

ManufacturerModels
HiSiliconHi3516CV100/200/300, Hi3516EV100/200/300, Hi3516DV300, Hi3518EV100
SigmaStarSSC335
XiongmaiXM510, XM530, XM550
RockchipRV1109

Please test on your device to help us extend the list.

Supported boards

Tested on:

ManufacturerModels
XiongmaiVarious models
HankvisionV6202IR-IMX327
RuisionRS-H649F-A0, RS-H651JAI-AO, RS-H656S-AO
TP-LinkNC210

Supported sensors

Tested on:

ManufacturerModels
Silicon Optronics, Inc.JX-F22, JX-F23, JX-F37, JX-H62, JX-H65, JX-K05
SonyIMX224, IMX290, IMX291, IMX307, IMX322, IMX323, IMX327, IMX335, IMX415
ON SemiconductorAR0130, AR0237
SmartSensSC2135, SC2232, SC2235, SC2235P, SC2239, SC2315e (SC307E, SC4239Р), SC335E (SC5300)
OmniVisionOV9712
GalaxyCoreGC2053

Please test on your device to help us extend the list.


Support

OpenIPC offers two levels of support.

  • Free support through the community (via chat).
  • Paid commercial support (from the team of developers).

Please consider subscribing for paid commercial support if you intend to use our product for business. As a paid customer, you will get technical support and maintenance services directly from our skilled team. Your bug reports and feature requests will get prioritized attention and expedited solutions. It's a win-win strategy for both parties, that would contribute to the stability your business, and help core developers to work on the project full-time.

If you have any specific questions concerning our project, feel free to contact us.

Participating and Contribution

If you like what we do, and willing to intensify the development, please consider participating.

You can improve existing code and send us patches. You can add new features missing from our code.

You can help us to write a better documentation, proofread and correct our websites.

You can just donate some money to cover the cost of development and long-term maintaining of what we believe is going to be the most stable, flexible, and open IP Network Camera Framework for users like yourself.

You can make a financial contribution to the project at Open Collective.

Thank you.

Open Collective donate button

About

Simple tool (and library) for checking IP camera hardware

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OpenIPC Logo

IP camera hardware checking tool

BuildCI statusGitHub repo sizeGitHub issuesGitHub pull requestsLicense

This basic concept belongs to Maxim Chertov (thank you for your original utility) and Nikita Orlov (for cute YAML format for describing hardware). A warm welcome also to Igor Zalatov (for suggestions for new features and describing ways to do them).


Download

Use the link to download latest build (even directly to your camera). The build uses musl C library to work on vast majority of hardware.

Alternative launch methods

  • Public NFS server (in case your camera firmware includes NFS client support, proven to work on XM cameras):

    $ mount -o nolock 95.217.179.189:/srv/ro /utils/
    $ /utils/ipctool
  • Using telnet/console and uget utility: basically convert small uget binary into echo/printf chunks and deploy to /tmp partition. Read more in documentation

  • TFTP, since some cameras have tftp clients and/or servers by default. Assuming you have the ipctool-mips32 binary ready under /directory/to/serve:

    On a desktop computer:

    $ pip install ptftpd
    $ ptftpd -p 6969 en0 /directory/to/serve
    

    On the camera:

     # tftp -r /directory/to/serve/ipctool-mips32 -g 192.168.1.107 6969
    46% |************** | 61952 0:00:01 ETA
    

Usage

# ipctool -hWhere: -c, --chip-name read chip name -s, --sensor-name read sensor model and control line -t, --temp read chip temperature (where supported) backup <filename> save backup into a file restore [mac|filename] restore from backup (cloud-based or local file) [-s, --skip-env] skip environment [-f, --force] enforce upgrade <bundle> upgrade to OpenIPC firmware (experimental feature, use only on cameras with UART) [-f, --force] enforce printenv drop-in replacement for fw_printenv setenv <key> <value> drop-in replacement for fw_setenv dmesg drop-in replacement for dmesg i2cget <device address> <register> spiget <register> read data from I2C/SPI device i2cset <device address> <register> <new value> spiset <register> <new value> write a value to I2C/SPI device i2cdump [--script] <device address> <from register> <to register> spidump [--script] <from register> <to register> dump data from I2C/SPI device reginfo [--script] dump current status of pinmux registers gpio (scan|mux) GPIO utilities trace [--skip=usleep] <full/path/to/executable> [program arguments] dump original firmware calls and data structures -h, --help this help

When run without parameters utility produces YAML with all hardware-specific information about given IP-camera or DVR:

---
board:
vendor: Xiongmaimodel: 50H20LcloudId: 3beae2b40d84f889chip:
vendor: HiSiliconmodel: 3516CV300ethernet:
mac: "00:12:89:12:88:e1"u-mdio-phyaddr: 1phy-id: 0x001cc816d-mdio-phyaddr: 0rom:
- type: norblock: 64Kchip:
name: "w25q128"id: 0xef4018partitions:
- name: bootsize: 0x30000sha1: 7a7a83e9contains:
- name: xmcryptooffset: 0x1fc00
- name: uboot-envoffset: 0x20000
- name: romfssize: 0x2e0000path: /,squashfssha1: 62529dab
- name: usersize: 0x300000path: /usr,squashfssha1: cbb7e9ca
- name: websize: 0x160000path: /mnt/custom/data/Fonts,squashfssha1: 48140b3b
- name: customsize: 0x40000path: /mnt/custom,cramfssha1: fb72a5f5
- name: mtdsize: 0x50000path: /mnt/mtd,jffs2,rwsize: 8Maddr-mode: 3-byteram:
total: 128Mmedia: 72Mfirmware:
u-boot: "2010.06-svn1098 (Jun 11 2018 - 13:17:42)"kernel: "3.18.20 (Thu Jul 5 14:44:19 CST 2018)"toolchain: gcc version 4.9.4 20150629 (prerelease) (Hisilicon_v500_20170922) libc: uClibc 0.9.33.2sdk: "Hi3516CV300_MPP_V1.0.0.0 B010 Release (Jun 22 2018, 19:22:22)"main-app: /usr/bin/Sofiasensors:
- vendor: Sonymodel: IMX291control:
bus: 0type: i2caddr: 0x34params:
bitness: 12databus: LVDS 4 chfps: 30data:
type: LVDSlane-id:
- 0
- 1
- 2
- 3lvds-wdr-en: 0lvds-wdr-mode: 0lvds-wdr-num: 0raw-data-type: RAW_DATA_12BITsync-mode: LVDS_SYNC_MODE_SAVdata-endian: LVDS_ENDIAN_BIGsync-code-endian: LVDS_ENDIAN_BIGsync-code:
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0clock: 37.125MHz

In your own scripts

  • Determine chip name:

    # ipctool --chip-namehi3516cv300
  • Determine sensor model and control line:

    # ipctool --sensor-nameimx291_i2c
  • Get temperature from chip's internal sensor (not all devices supported):

    # ipctool --temp50.69

As backup/restore tool

  • Save full backup with YAML metadata into specific file:

    # mount -o nolock mynfsserver:/srv /var/utils
    # ipctool backup /var/utils/mybackup-00:12:17:83:d6:39
    # sync

As reverse engineering tool

  • Drop-in replacement of dmesg command:

    # ipctool dmesg
  • Drop-in replacement of fw_printenv and fw_setenv commands:

    # ipctool printenv | grep bootargs
    # ipctool setenv bootargs "mem=\${osmem} mtdparts=hi_sfc:256k(boot),64k(env),2048k(kernel),5120k(rootfs),-(rootfs_data)"
  • Drop-in replacement of i2cget, i2cset and i2cdump commands from i2c-tools package:

    # ipctool i2cget 0x34 0x3000
    # ipctool i2cset 0x34 0x3000 1
    # ipctool i2cdump 0x34 0x3000 0x31ff
    # ipctool i2cdump --script 0x34 0x3000 0x31ff
  • The same approach is to manipulate SPI sensor registers:

    # ipctool spiget 0x200
    # ipctool spiset 0x200 1
    # ipctool spidump 0x200 0x300
    # ipctool spidump --script 0x200 0x300
  • Dump the state of pinmux registers in human- and machine-readable format or shell script ready to be applied on another system:

    # ipctool reginfo
    # ipctool --script reginfo
  • Advanced replacement of strace:

    # ipctool trace /usr/bin/Sofia

Supported SoCs

Tested on:

ManufacturerModels
HiSiliconHi3516CV100/200/300, Hi3516EV100/200/300, Hi3516DV300, Hi3518EV100
SigmaStarSSC335
XiongmaiXM510, XM530, XM550
RockchipRV1109

Please test on your device to help us extend the list.

Supported boards

Tested on:

ManufacturerModels
XiongmaiVarious models
HankvisionV6202IR-IMX327
RuisionRS-H649F-A0, RS-H651JAI-AO, RS-H656S-AO
TP-LinkNC210

Supported sensors

Tested on:

ManufacturerModels
Silicon Optronics, Inc.JX-F22, JX-F23, JX-F37, JX-H62, JX-H65, JX-K05
SonyIMX224, IMX290, IMX291, IMX307, IMX322, IMX323, IMX327, IMX335, IMX415
ON SemiconductorAR0130, AR0237
SmartSensSC2135, SC2232, SC2235, SC2235P, SC2239, SC2315e (SC307E, SC4239Р), SC335E (SC5300)
OmniVisionOV9712
GalaxyCoreGC2053

Please test on your device to help us extend the list.


Support

OpenIPC offers two levels of support.

  • Free support through the community (via chat).
  • Paid commercial support (from the team of developers).

Please consider subscribing for paid commercial support if you intend to use our product for business. As a paid customer, you will get technical support and maintenance services directly from our skilled team. Your bug reports and feature requests will get prioritized attention and expedited solutions. It's a win-win strategy for both parties, that would contribute to the stability your business, and help core developers to work on the project full-time.

If you have any specific questions concerning our project, feel free to contact us.

Participating and Contribution

If you like what we do, and willing to intensify the development, please consider participating.

You can improve existing code and send us patches. You can add new features missing from our code.

You can help us to write a better documentation, proofread and correct our websites.

You can just donate some money to cover the cost of development and long-term maintaining of what we believe is going to be the most stable, flexible, and open IP Network Camera Framework for users like yourself.

You can make a financial contribution to the project at Open Collective.

Thank you.

Open Collective donate button

About

Simple tool (and library) for checking IP camera hardware

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OpenIPC Logo

IP camera hardware checking tool

BuildCI statusGitHub repo sizeGitHub issuesGitHub pull requestsLicense

This basic concept belongs to Maxim Chertov (thank you for your original utility) and Nikita Orlov (for cute YAML format for describing hardware). A warm welcome also to Igor Zalatov (for suggestions for new features and describing ways to do them).


Download

Use the link to download latest build (even directly to your camera). The build uses musl C library to work on vast majority of hardware.

Alternative launch methods

  • Public NFS server (in case your camera firmware includes NFS client support, proven to work on XM cameras):

    $ mount -o nolock 95.217.179.189:/srv/ro /utils/
    $ /utils/ipctool
  • Using telnet/console and uget utility: basically convert small uget binary into echo/printf chunks and deploy to /tmp partition. Read more in documentation

  • TFTP, since some cameras have tftp clients and/or servers by default. Assuming you have the ipctool-mips32 binary ready under /directory/to/serve:

    On a desktop computer:

    $ pip install ptftpd
    $ ptftpd -p 6969 en0 /directory/to/serve
    

    On the camera:

     # tftp -r /directory/to/serve/ipctool-mips32 -g 192.168.1.107 6969
    46% |************** | 61952 0:00:01 ETA
    

Usage

# ipctool -hWhere: -c, --chip-name read chip name -s, --sensor-name read sensor model and control line -t, --temp read chip temperature (where supported) backup <filename> save backup into a file restore [mac|filename] restore from backup (cloud-based or local file) [-s, --skip-env] skip environment [-f, --force] enforce upgrade <bundle> upgrade to OpenIPC firmware (experimental feature, use only on cameras with UART) [-f, --force] enforce printenv drop-in replacement for fw_printenv setenv <key> <value> drop-in replacement for fw_setenv dmesg drop-in replacement for dmesg i2cget <device address> <register> spiget <register> read data from I2C/SPI device i2cset <device address> <register> <new value> spiset <register> <new value> write a value to I2C/SPI device i2cdump [--script] <device address> <from register> <to register> spidump [--script] <from register> <to register> dump data from I2C/SPI device reginfo [--script] dump current status of pinmux registers gpio (scan|mux) GPIO utilities trace [--skip=usleep] <full/path/to/executable> [program arguments] dump original firmware calls and data structures -h, --help this help

When run without parameters utility produces YAML with all hardware-specific information about given IP-camera or DVR:

---
board:
vendor: Xiongmaimodel: 50H20LcloudId: 3beae2b40d84f889chip:
vendor: HiSiliconmodel: 3516CV300ethernet:
mac: "00:12:89:12:88:e1"u-mdio-phyaddr: 1phy-id: 0x001cc816d-mdio-phyaddr: 0rom:
- type: norblock: 64Kchip:
name: "w25q128"id: 0xef4018partitions:
- name: bootsize: 0x30000sha1: 7a7a83e9contains:
- name: xmcryptooffset: 0x1fc00
- name: uboot-envoffset: 0x20000
- name: romfssize: 0x2e0000path: /,squashfssha1: 62529dab
- name: usersize: 0x300000path: /usr,squashfssha1: cbb7e9ca
- name: websize: 0x160000path: /mnt/custom/data/Fonts,squashfssha1: 48140b3b
- name: customsize: 0x40000path: /mnt/custom,cramfssha1: fb72a5f5
- name: mtdsize: 0x50000path: /mnt/mtd,jffs2,rwsize: 8Maddr-mode: 3-byteram:
total: 128Mmedia: 72Mfirmware:
u-boot: "2010.06-svn1098 (Jun 11 2018 - 13:17:42)"kernel: "3.18.20 (Thu Jul 5 14:44:19 CST 2018)"toolchain: gcc version 4.9.4 20150629 (prerelease) (Hisilicon_v500_20170922) libc: uClibc 0.9.33.2sdk: "Hi3516CV300_MPP_V1.0.0.0 B010 Release (Jun 22 2018, 19:22:22)"main-app: /usr/bin/Sofiasensors:
- vendor: Sonymodel: IMX291control:
bus: 0type: i2caddr: 0x34params:
bitness: 12databus: LVDS 4 chfps: 30data:
type: LVDSlane-id:
- 0
- 1
- 2
- 3lvds-wdr-en: 0lvds-wdr-mode: 0lvds-wdr-num: 0raw-data-type: RAW_DATA_12BITsync-mode: LVDS_SYNC_MODE_SAVdata-endian: LVDS_ENDIAN_BIGsync-code-endian: LVDS_ENDIAN_BIGsync-code:
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0clock: 37.125MHz

In your own scripts

  • Determine chip name:

    # ipctool --chip-namehi3516cv300
  • Determine sensor model and control line:

    # ipctool --sensor-nameimx291_i2c
  • Get temperature from chip's internal sensor (not all devices supported):

    # ipctool --temp50.69

As backup/restore tool

  • Save full backup with YAML metadata into specific file:

    # mount -o nolock mynfsserver:/srv /var/utils
    # ipctool backup /var/utils/mybackup-00:12:17:83:d6:39
    # sync

As reverse engineering tool

  • Drop-in replacement of dmesg command:

    # ipctool dmesg
  • Drop-in replacement of fw_printenv and fw_setenv commands:

    # ipctool printenv | grep bootargs
    # ipctool setenv bootargs "mem=\${osmem} mtdparts=hi_sfc:256k(boot),64k(env),2048k(kernel),5120k(rootfs),-(rootfs_data)"
  • Drop-in replacement of i2cget, i2cset and i2cdump commands from i2c-tools package:

    # ipctool i2cget 0x34 0x3000
    # ipctool i2cset 0x34 0x3000 1
    # ipctool i2cdump 0x34 0x3000 0x31ff
    # ipctool i2cdump --script 0x34 0x3000 0x31ff
  • The same approach is to manipulate SPI sensor registers:

    # ipctool spiget 0x200
    # ipctool spiset 0x200 1
    # ipctool spidump 0x200 0x300
    # ipctool spidump --script 0x200 0x300
  • Dump the state of pinmux registers in human- and machine-readable format or shell script ready to be applied on another system:

    # ipctool reginfo
    # ipctool --script reginfo
  • Advanced replacement of strace:

    # ipctool trace /usr/bin/Sofia

Supported SoCs

Tested on:

ManufacturerModels
HiSiliconHi3516CV100/200/300, Hi3516EV100/200/300, Hi3516DV300, Hi3518EV100
SigmaStarSSC335
XiongmaiXM510, XM530, XM550
RockchipRV1109

Please test on your device to help us extend the list.

Supported boards

Tested on:

ManufacturerModels
XiongmaiVarious models
HankvisionV6202IR-IMX327
RuisionRS-H649F-A0, RS-H651JAI-AO, RS-H656S-AO
TP-LinkNC210

Supported sensors

Tested on:

ManufacturerModels
Silicon Optronics, Inc.JX-F22, JX-F23, JX-F37, JX-H62, JX-H65, JX-K05
SonyIMX224, IMX290, IMX291, IMX307, IMX322, IMX323, IMX327, IMX335, IMX415
ON SemiconductorAR0130, AR0237
SmartSensSC2135, SC2232, SC2235, SC2235P, SC2239, SC2315e (SC307E, SC4239Р), SC335E (SC5300)
OmniVisionOV9712
GalaxyCoreGC2053

Please test on your device to help us extend the list.


Support

OpenIPC offers two levels of support.

  • Free support through the community (via chat).
  • Paid commercial support (from the team of developers).

Please consider subscribing for paid commercial support if you intend to use our product for business. As a paid customer, you will get technical support and maintenance services directly from our skilled team. Your bug reports and feature requests will get prioritized attention and expedited solutions. It's a win-win strategy for both parties, that would contribute to the stability your business, and help core developers to work on the project full-time.

If you have any specific questions concerning our project, feel free to contact us.

Participating and Contribution

If you like what we do, and willing to intensify the development, please consider participating.

You can improve existing code and send us patches. You can add new features missing from our code.

You can help us to write a better documentation, proofread and correct our websites.

You can just donate some money to cover the cost of development and long-term maintaining of what we believe is going to be the most stable, flexible, and open IP Network Camera Framework for users like yourself.

You can make a financial contribution to the project at Open Collective.

Thank you.

Open Collective donate button

About

Simple tool (and library) for checking IP camera hardware

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

OpenIPC Logo

IP camera hardware checking tool

BuildCI statusGitHub repo sizeGitHub issuesGitHub pull requestsLicense

This basic concept belongs to Maxim Chertov (thank you for your original utility) and Nikita Orlov (for cute YAML format for describing hardware). A warm welcome also to Igor Zalatov (for suggestions for new features and describing ways to do them).


Download

Use the link to download latest build (even directly to your camera). The build uses musl C library to work on vast majority of hardware.

Alternative launch methods

  • Public NFS server (in case your camera firmware includes NFS client support, proven to work on XM cameras):

    $ mount -o nolock 95.217.179.189:/srv/ro /utils/
    $ /utils/ipctool
  • Using telnet/console and uget utility: basically convert small uget binary into echo/printf chunks and deploy to /tmp partition. Read more in documentation

  • TFTP, since some cameras have tftp clients and/or servers by default. Assuming you have the ipctool-mips32 binary ready under /directory/to/serve:

    On a desktop computer:

    $ pip install ptftpd
    $ ptftpd -p 6969 en0 /directory/to/serve
    

    On the camera:

     # tftp -r /directory/to/serve/ipctool-mips32 -g 192.168.1.107 6969
    46% |************** | 61952 0:00:01 ETA
    

Usage

# ipctool -hWhere: -c, --chip-name read chip name -s, --sensor-name read sensor model and control line -t, --temp read chip temperature (where supported) backup <filename> save backup into a file restore [mac|filename] restore from backup (cloud-based or local file) [-s, --skip-env] skip environment [-f, --force] enforce upgrade <bundle> upgrade to OpenIPC firmware (experimental feature, use only on cameras with UART) [-f, --force] enforce printenv drop-in replacement for fw_printenv setenv <key> <value> drop-in replacement for fw_setenv dmesg drop-in replacement for dmesg i2cget <device address> <register> spiget <register> read data from I2C/SPI device i2cset <device address> <register> <new value> spiset <register> <new value> write a value to I2C/SPI device i2cdump [--script] <device address> <from register> <to register> spidump [--script] <from register> <to register> dump data from I2C/SPI device reginfo [--script] dump current status of pinmux registers gpio (scan|mux) GPIO utilities trace [--skip=usleep] <full/path/to/executable> [program arguments] dump original firmware calls and data structures -h, --help this help

When run without parameters utility produces YAML with all hardware-specific information about given IP-camera or DVR:

---
board:
vendor: Xiongmaimodel: 50H20LcloudId: 3beae2b40d84f889chip:
vendor: HiSiliconmodel: 3516CV300ethernet:
mac: "00:12:89:12:88:e1"u-mdio-phyaddr: 1phy-id: 0x001cc816d-mdio-phyaddr: 0rom:
- type: norblock: 64Kchip:
name: "w25q128"id: 0xef4018partitions:
- name: bootsize: 0x30000sha1: 7a7a83e9contains:
- name: xmcryptooffset: 0x1fc00
- name: uboot-envoffset: 0x20000
- name: romfssize: 0x2e0000path: /,squashfssha1: 62529dab
- name: usersize: 0x300000path: /usr,squashfssha1: cbb7e9ca
- name: websize: 0x160000path: /mnt/custom/data/Fonts,squashfssha1: 48140b3b
- name: customsize: 0x40000path: /mnt/custom,cramfssha1: fb72a5f5
- name: mtdsize: 0x50000path: /mnt/mtd,jffs2,rwsize: 8Maddr-mode: 3-byteram:
total: 128Mmedia: 72Mfirmware:
u-boot: "2010.06-svn1098 (Jun 11 2018 - 13:17:42)"kernel: "3.18.20 (Thu Jul 5 14:44:19 CST 2018)"toolchain: gcc version 4.9.4 20150629 (prerelease) (Hisilicon_v500_20170922) libc: uClibc 0.9.33.2sdk: "Hi3516CV300_MPP_V1.0.0.0 B010 Release (Jun 22 2018, 19:22:22)"main-app: /usr/bin/Sofiasensors:
- vendor: Sonymodel: IMX291control:
bus: 0type: i2caddr: 0x34params:
bitness: 12databus: LVDS 4 chfps: 30data:
type: LVDSlane-id:
- 0
- 1
- 2
- 3lvds-wdr-en: 0lvds-wdr-mode: 0lvds-wdr-num: 0raw-data-type: RAW_DATA_12BITsync-mode: LVDS_SYNC_MODE_SAVdata-endian: LVDS_ENDIAN_BIGsync-code-endian: LVDS_ENDIAN_BIGsync-code:
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- - 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0
- 0xab0, 0xb60, 0x800, 0x9d0clock: 37.125MHz

In your own scripts

  • Determine chip name:

    # ipctool --chip-namehi3516cv300
  • Determine sensor model and control line:

    # ipctool --sensor-nameimx291_i2c
  • Get temperature from chip's internal sensor (not all devices supported):

    # ipctool --temp50.69

As backup/restore tool

  • Save full backup with YAML metadata into specific file:

    # mount -o nolock mynfsserver:/srv /var/utils
    # ipctool backup /var/utils/mybackup-00:12:17:83:d6:39
    # sync

As reverse engineering tool

  • Drop-in replacement of dmesg command:

    # ipctool dmesg
  • Drop-in replacement of fw_printenv and fw_setenv commands:

    # ipctool printenv | grep bootargs
    # ipctool setenv bootargs "mem=\${osmem} mtdparts=hi_sfc:256k(boot),64k(env),2048k(kernel),5120k(rootfs),-(rootfs_data)"
  • Drop-in replacement of i2cget, i2cset and i2cdump commands from i2c-tools package:

    # ipctool i2cget 0x34 0x3000
    # ipctool i2cset 0x34 0x3000 1
    # ipctool i2cdump 0x34 0x3000 0x31ff
    # ipctool i2cdump --script 0x34 0x3000 0x31ff
  • The same approach is to manipulate SPI sensor registers:

    # ipctool spiget 0x200
    # ipctool spiset 0x200 1
    # ipctool spidump 0x200 0x300
    # ipctool spidump --script 0x200 0x300
  • Dump the state of pinmux registers in human- and machine-readable format or shell script ready to be applied on another system:

    # ipctool reginfo
    # ipctool --script reginfo
  • Advanced replacement of strace:

    # ipctool trace /usr/bin/Sofia

Supported SoCs

Tested on:

ManufacturerModels
HiSiliconHi3516CV100/200/300, Hi3516EV100/200/300, Hi3516DV300, Hi3518EV100
SigmaStarSSC335
XiongmaiXM510, XM530, XM550
RockchipRV1109

Please test on your device to help us extend the list.

Supported boards

Tested on:

ManufacturerModels
XiongmaiVarious models
HankvisionV6202IR-IMX327
RuisionRS-H649F-A0, RS-H651JAI-AO, RS-H656S-AO
TP-LinkNC210

Supported sensors

Tested on:

ManufacturerModels
Silicon Optronics, Inc.JX-F22, JX-F23, JX-F37, JX-H62, JX-H65, JX-K05
SonyIMX224, IMX290, IMX291, IMX307, IMX322, IMX323, IMX327, IMX335, IMX415
ON SemiconductorAR0130, AR0237
SmartSensSC2135, SC2232, SC2235, SC2235P, SC2239, SC2315e (SC307E, SC4239Р), SC335E (SC5300)
OmniVisionOV9712
GalaxyCoreGC2053

Please test on your device to help us extend the list.


Support

OpenIPC offers two levels of support.

  • Free support through the community (via chat).
  • Paid commercial support (from the team of developers).

Please consider subscribing for paid commercial support if you intend to use our product for business. As a paid customer, you will get technical support and maintenance services directly from our skilled team. Your bug reports and feature requests will get prioritized attention and expedited solutions. It's a win-win strategy for both parties, that would contribute to the stability your business, and help core developers to work on the project full-time.

If you have any specific questions concerning our project, feel free to contact us.

Participating and Contribution

If you like what we do, and willing to intensify the development, please consider participating.

You can improve existing code and send us patches. You can add new features missing from our code.

You can help us to write a better documentation, proofread and correct our websites.

You can just donate some money to cover the cost of development and long-term maintaining of what we believe is going to be the most stable, flexible, and open IP Network Camera Framework for users like yourself.

You can make a financial contribution to the project at Open Collective.

Thank you.

Open Collective donate button

About

Simple tool (and library) for checking IP camera hardware

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages