{"id":1600,"date":"2025-05-20T10:05:22","date_gmt":"2025-05-20T02:05:22","guid":{"rendered":"https:\/\/swordofmorning.com\/?p=1600"},"modified":"2025-10-09T13:54:09","modified_gmt":"2025-10-09T05:54:09","slug":"rk3588-03","status":"publish","type":"post","link":"https:\/\/swordofmorning.com\/index.php\/2025\/05\/20\/rk3588-03\/","title":{"rendered":"RK3588 \u5206\u533a"},"content":{"rendered":"<p><div class=\"has-toc have-toc\"><\/div><\/p>\n<h2>\u4e00\u3001\u5206\u533a\u8bbe\u7f6e<\/h2>\n<p>\u539f\u59cb\u914d\u7f6e\uff1a<\/p>\n<pre><code class=\"language-txt\">FIRMWARE_VER: 1.0\nMACHINE_MODEL: RK3588\nMACHINE_ID: 007\nMANUFACTURER: RK3588\nMAGIC: 0x5041524B\nATAG: 0x00200800\nMACHINE: 0xffffffff\nCHECK_MASK: 0x80\nPWR_HLD: 0,0,A,0,1\nTYPE: GPT\nGROW_ALIGN: 0\nCMDLINE: mtdparts=:0x00002000@0x00004000(uboot),0x00002000@0x00006000(misc),0x00020000@0x00008000(boot),0x00080000@0x00028000(recovery),0x00010000@0x00108000(backup),-@0x00118000(rootfs:grow)\nuuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9\nuuid:boot=7A3F0000-0000-446A-8000-702F00006273<\/code><\/pre>\n<p>\u65b0\u914d\u7f6e\uff1a<\/p>\n<pre><code class=\"language-txt\">FIRMWARE_VER: 1.0\nMACHINE_MODEL: RK3588\nMACHINE_ID: 007\nMANUFACTURER: RK3588\nMAGIC: 0x5041524B\nATAG: 0x00200800\nMACHINE: 0xffffffff\nCHECK_MASK: 0x80\nPWR_HLD: 0,0,A,0,1\nTYPE: GPT\nGROW_ALIGN: 0\nCMDLINE: mtdparts=:0x00002000@0x00004000(uboot),0x00002000@0x00006000(misc),0x00020000@0x00008000(boot),0x00080000@0x00028000(recovery),0x00010000@0x00108000(backup),0x00400000@0x00118000(rootfs),0x00040000@0x00518000(app),0x00040000@0x00558000(oemven),-@0x00598000(userdata:grow)\nuuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9\nuuid:boot=7A3F0000-0000-446A-8000-702F00006273<\/code><\/pre>\n<p>\u4fee\u6539\u9879\u4e3a\uff1a<\/p>\n<ol>\n<li>\u9650\u5236rootfs\u5206\u533a\u5927\u5c0f\uff1b<\/li>\n<li>\u65b0\u589eapp\u548coemven\u5206\u533a\uff1b<\/li>\n<li>\u4fee\u6539userdata\u5206\u533a\u914d\u7f6e\u3002<\/li>\n<\/ol>\n<h2>\u4e8c\u3001\u955c\u50cf\u6253\u5305<\/h2>\n<p>&emsp;&emsp;\u955c\u50cf\u6253\u5305\u53ef\u4ee5\u8c03\u7528<code>mk-image.sh<\/code>\u6765\u5b9e\u73b0\uff0c\u5176\u8c03\u7528\u65b9\u5f0f\u4e3a\uff1a<\/p>\n<pre><code class=\"language-sh\">Usage: $0 &lt;src_dir&gt; &lt;target_image&gt; &lt;fs_type&gt; &lt;size(M|K)|auto(0)&gt; [label]<\/code><\/pre>\n<p>\u5b8c\u6574\u7684<code>mk-image.sh<\/code>\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-sh\">#!\/bin\/bash\n\n# Prefer using buildroot host tools for compatible.\nif [ -n &quot;$RK_BUILDROOT_CFG&quot; ]; then\n    HOST_DIR=&quot;$SDK_DIR\/buildroot\/output\/$RK_BUILDROOT_CFG\/host&quot;\n    export PATH=$HOST_DIR\/usr\/sbin:$HOST_DIR\/usr\/bin:$HOST_DIR\/sbin:$HOST_DIR\/bin:$PATH\n    echo &quot;Using host tools in $HOST_DIR&quot;\nelse\n    &quot;$(dirname &quot;$(realpath &quot;$0&quot;)&quot;)\/check-mkimage.sh&quot;\nfi\n\nfatal()\n{\n    echo -e &quot;FATAL: &quot; $@\n    exit 1\n}\n\nusage()\n{\n    echo $@\n    fatal &quot;Usage: $0 &lt;src_dir&gt; &lt;target_image&gt; &lt;fs_type&gt; &lt;size(M|K)|auto(0)&gt; [label]&quot;\n}\n\n[ ! $# -lt 4 ] || usage &quot;Not enough args${@+: $0 $@}&quot;\n\nexport SRC_DIR=$1\nexport TARGET=$2\nFS_TYPE=$3\nSIZE=$4\nLABEL=$5\n\ncase $SIZE in\n    auto)\n        SIZE_KB=0\n        ;;\n    *K)\n        SIZE_KB=$(( ${SIZE%K} ))\n        ;;\n    *)\n        SIZE_KB=$(( ${SIZE%M} * 1024 )) # default is MB\n        ;;\nesac\n\necho $SIZE_KB | grep -vq [^0-9] || usage &quot;Invalid size: $SIZE_KB&quot;\n\nTEMP=$(mktemp -u)\n\n[ -d &quot;$SRC_DIR&quot; ] || usage &quot;No such src dir: $SRC_DIR&quot;\n\ncopy_to_ntfs()\n{\n    DEPTH=1\n    while true;do\n        find $SRC_DIR -maxdepth $DEPTH -mindepth $DEPTH -type d|grep -q &quot;&quot; \\\n            || break\n        find $SRC_DIR -maxdepth $DEPTH -mindepth $DEPTH -type d \\\n            -exec sh -c &#039;ntfscp $TARGET &quot;$1&quot; &quot;${1#$SRC_DIR}&quot;&#039; sh {} \\; || \\\n        fatal &quot;Detected non-buildroot ntfscp(doesn&#039;t support dir copy)&quot;\n        DEPTH=$(($DEPTH + 1))\n    done\n\n    find $SRC_DIR -type f \\\n        -exec sh -c &#039;ntfscp $TARGET &quot;$1&quot; &quot;${1#$SRC_DIR}&quot;&#039; sh {} \\; || \\\n            fatal &quot;Failed to do ntfscp!&quot;\n}\n\ncopy_to_image()\n{\n    ls $SRC_DIR\/* &amp;&gt;\/dev\/null || return 0\n\n    echo &quot;Copying $SRC_DIR into $TARGET (root permission required)&quot;\n    mkdir -p $TEMP || return 1\n    sudo mount $TARGET $TEMP || return 1\n\n    cp -rp $SRC_DIR\/* $TEMP\n    RET=$?\n\n    sudo umount $TEMP\n    rm -rf $TEMP\n\n    return $RET\n}\n\ncheck_host_tool()\n{\n    which $1|grep -wq buildroot\n}\n\nmkimage()\n{\n    echo &quot;Making $TARGET from $SRC_DIR with size(${SIZE_KB}KB)&quot;\n    rm -rf $TARGET\n    dd of=$TARGET bs=1K seek=$SIZE_KB count=0 &amp;&gt;\/dev\/null || \\\n        fatal &quot;Failed to dd image!&quot;\n    case $FS_TYPE in\n        ext[234])\n            if mke2fs -h 2&gt;&amp;1 | grep -wq &quot;\\-d&quot;; then\n                mke2fs -t $FS_TYPE $TARGET -d $SRC_DIR \\\n                    || return 1\n            else\n                echo &quot;Detected old mke2fs(doesn&#039;t support &#039;-d&#039; option)!&quot;\n                mke2fs -t $FS_TYPE $TARGET || return 1\n                copy_to_image || return 1\n            fi\n            # Set max-mount-counts to 0, and disable the time-dependent checking.\n            tune2fs -c 0 -i 0 $TARGET ${LABEL:+-L $LABEL}\n            ;;\n        msdos|fat|vfat)\n            # Use fat32 by default\n            mkfs.vfat -F 32 $TARGET ${LABEL:+-n $LABEL} &amp;&amp; \\\n                MTOOLS_SKIP_CHECK=1 \\\n                mcopy -bspmn -D s -i $TARGET $SRC_DIR\/* ::\/\n            ;;\n        ntfs)\n            # Enable compression\n            mkntfs -FCQ $TARGET ${LABEL:+-L $LABEL}\n            if check_host_tool ntfscp; then\n                copy_to_ntfs\n            else\n                copy_to_image\n            fi\n            ;;\n        ubi|ubifs)\n            mk_ubi_image\n            ;;\n    esac\n}\n\nmkimage_auto_sized()\n{\n    tar cf $TEMP $SRC_DIR &amp;&gt;\/dev\/null\n    SIZE_KB=$(du -k $TEMP|grep -o &quot;^[0-9]*&quot;)\n    rm -rf $TEMP\n    echo &quot;Making $TARGET from $SRC_DIR (auto sized)&quot;\n\n    MAX_RETRY=10\n    RETRY=0\n\n    while true;do\n        EXTRA_SIZE=$(($SIZE_KB \/ 50))\n        SIZE_KB=$(($SIZE_KB + ($EXTRA_SIZE &gt; 4096 ? $EXTRA_SIZE : 4096)))\n        mkimage &amp;&amp; break\n\n        RETRY=$[RETRY+1]\n        [ $RETRY -gt $MAX_RETRY ] &amp;&amp; fatal &quot;Failed to make image!&quot;\n        echo &quot;Retring with increased size....($RETRY\/$MAX_RETRY)&quot;\n    done\n}\n\nmk_ubi_image()\n{\n    TARGET_DIR=&quot;${RK_OUTDIR:-$(dirname &quot;$TARGET&quot;)}&quot;\n    UBI_VOL_NAME=${LABEL:-ubi}\n\n    # default page size 2KB\n    UBI_PAGE_SIZE=${RK_UBI_PAGE_SIZE:-2048}\n    # default block size 128KB\n    UBI_BLOCK_SIZE=${RK_UBI_BLOCK_SIZE:-0x20000}\n\n    UBIFS_LEBSIZE=$(( $UBI_BLOCK_SIZE - 2 * $UBI_PAGE_SIZE ))\n    UBIFS_MINIOSIZE=$UBI_PAGE_SIZE\n\n    UBIFS_IMAGE=&quot;$TARGET_DIR\/$UBI_VOL_NAME.ubifs&quot;\n    UBINIZE_CFG=&quot;$TARGET_DIR\/${UBI_VOL_NAME}-ubinize.cfg&quot;\n\n    UBIFS_MAXLEBCNT=$(( $SIZE_KB * 1024 \/ $UBIFS_LEBSIZE ))\n\n    mkfs.ubifs -x lzo -e $UBIFS_LEBSIZE -m $UBIFS_MINIOSIZE \\\n        -c $UBIFS_MAXLEBCNT -d $SRC_DIR -F -v -o $UBIFS_IMAGE || return 1\n\n    echo &quot;[ubifs]&quot; &gt; $UBINIZE_CFG\n    echo &quot;mode=ubi&quot; &gt;&gt; $UBINIZE_CFG\n    echo &quot;vol_id=0&quot; &gt;&gt; $UBINIZE_CFG\n    echo &quot;vol_type=dynamic&quot; &gt;&gt; $UBINIZE_CFG\n    echo &quot;vol_name=$UBI_VOL_NAME&quot; &gt;&gt; $UBINIZE_CFG\n    echo &quot;vol_size=${SIZE_KB}KiB&quot; &gt;&gt; $UBINIZE_CFG\n    echo &quot;vol_alignment=1&quot; &gt;&gt; $UBINIZE_CFG\n    echo &quot;vol_flags=autoresize&quot; &gt;&gt; $UBINIZE_CFG\n    echo &quot;image=$UBIFS_IMAGE&quot; &gt;&gt; $UBINIZE_CFG\n    ubinize -o $TARGET -m $UBIFS_MINIOSIZE -p $UBI_BLOCK_SIZE \\\n        -v $UBINIZE_CFG\n}\n\nrm -rf $TARGET\ncase $FS_TYPE in\n    ext[234]|msdos|fat|vfat|ntfs|ubi|ubifs)\n        if [ $SIZE_KB -eq 0 ]; then\n            mkimage_auto_sized\n        else\n            mkimage &amp;&amp; echo &quot;Generated $TARGET&quot;\n        fi\n        ;;\n    squashfs)\n        [ $SIZE_KB -eq 0 ] || fatal &quot;$FS_TYPE: fixed size not supported.&quot;\n        mksquashfs $SRC_DIR $TARGET -noappend -comp lz4\n        ;;\n    jffs2)\n        [ $SIZE_KB -eq 0 ] || fatal &quot;$FS_TYPE: fixed size not supported.&quot;\n        mkfs.jffs2 -r $SRC_DIR -o $TARGET 0x10000 --pad=0x400000 -s 0x1000 -n\n        ;;\n    *)\n        usage &quot;File system: $FS_TYPE not supported.&quot;\n        ;;\nesac<\/code><\/pre>\n<p>&emsp;&emsp;\u8fdb\u4e00\u6b65\u5730\uff0c\u6211\u73b0\u5728\u6709\u5982\u4e0b\u7684\u4e00\u4e2a\u76ee\u5f55\uff1a<\/p>\n<pre><code class=\"language-sh\">.\n\u251c\u2500\u2500 app\n\u2502   \u251c\u2500\u2500 ai\n\u2502   \u251c\u2500\u2500 cl\n\u2502   \u251c\u2500\u2500 pre\n\u2502   \u251c\u2500\u2500 pseudo\n\u2502   \u2514\u2500\u2500 ui\n\u251c\u2500\u2500 app.img\n\u251c\u2500\u2500 mk-image.sh\n\u251c\u2500\u2500 oemven\n\u2502   \u2514\u2500\u2500 bootanimation\n\u251c\u2500\u2500 oemven.img\n\u251c\u2500\u2500 package.sh\n\u251c\u2500\u2500 userdata\n\u2514\u2500\u2500 userdata.img<\/code><\/pre>\n<p>\u6211\u6709\u4e09\u4e2a\u6587\u4ef6\u5939\uff1a<code>app<\/code>\u3001<code>oemven<\/code>\u548c<code>userdata<\/code>\uff0c\u6211\u4f7f\u7528\u4e86\u5982\u4e0b\u7684<code>package.sh<\/code>\u6765\u8fdb\u884c\u6253\u5305<\/p>\n<pre><code class=\"language-sh\">#!\/bin\/bash\n\n# \u68c0\u67e5\u53c2\u6570\nif [ $# -ne 1 ]; then\n    echo &quot;Usage: $0 &lt;partition_name&gt;&quot;\n    echo &quot;Supported partitions: app, oemven, userdata&quot;\n    exit 1\nfi\n\n# \u83b7\u53d6\u811a\u672c\u6240\u5728\u76ee\u5f55\u7684\u7edd\u5bf9\u8def\u5f84\nSCRIPT_DIR=&quot;$( cd &quot;$( dirname &quot;${BASH_SOURCE[0]}&quot; )&quot; &amp;&amp; pwd )&quot;\n\n# \u5206\u533a\u540d\u79f0\nPARTITION=$1\n\n# \u5b9a\u4e49\u56fa\u5b9a\u5927\u5c0f\u5206\u533a\u7684\u5927\u5c0f\nFIXED_SIZE=&quot;128M&quot;\n\n# \u68c0\u67e5\u5206\u533a\u540d\u662f\u5426\u6709\u6548\u5e76\u8bbe\u7f6e\u5927\u5c0f\ncase $PARTITION in\n    &quot;app&quot;|&quot;oemven&quot;)\n        # \u4f7f\u7528\u56fa\u5b9a\u5927\u5c0f\n        PARTITION_SIZE=$FIXED_SIZE\n        ;;\n    &quot;userdata&quot;)\n        # \u4f7f\u7528\u81ea\u52a8\u5927\u5c0f\n        PARTITION_SIZE=&quot;auto&quot;\n        ;;\n    *)\n        echo &quot;Error: Invalid partition name&quot;\n        echo &quot;Supported partitions: app, oemven, userdata&quot;\n        exit 1\n        ;;\nesac\n\n# \u8bbe\u7f6e\u53c2\u6570\nSOURCE_DIR=&quot;${SCRIPT_DIR}\/${PARTITION}&quot;\nIMAGE_NAME=&quot;${PARTITION}.img&quot;\nFS_TYPE=&quot;ext4&quot;\n\n# \u68c0\u67e5\u6e90\u76ee\u5f55\u662f\u5426\u5b58\u5728\nif [ ! -d &quot;$SOURCE_DIR&quot; ]; then\n    echo &quot;Error: Source directory &#039;$SOURCE_DIR&#039; not found&quot;\n    exit 1\nfi\n\n# \u68c0\u67e5mk-image.sh\u662f\u5426\u5b58\u5728\nif [ ! -f &quot;${SCRIPT_DIR}\/mk-image.sh&quot; ]; then\n    echo &quot;Error: mk-image.sh not found in $SCRIPT_DIR&quot;\n    exit 1\nfi\n\n# \u6267\u884c\u6253\u5305\u547d\u4ee4\necho &quot;Creating image for $PARTITION...&quot;\necho &quot;Source: $SOURCE_DIR&quot;\necho &quot;Target: $IMAGE_NAME&quot;\necho &quot;Filesystem: $FS_TYPE&quot;\necho &quot;Size: $PARTITION_SIZE&quot;\n\n&quot;${SCRIPT_DIR}\/mk-image.sh&quot; &quot;$SOURCE_DIR&quot; &quot;$IMAGE_NAME&quot; &quot;$FS_TYPE&quot; &quot;$PARTITION_SIZE&quot; &quot;$PARTITION&quot;\n\n# \u68c0\u67e5\u6267\u884c\u7ed3\u679c\nif [ $? -eq 0 ]; then\n    echo &quot;Successfully created $IMAGE_NAME&quot;\nelse\n    echo &quot;Error: Failed to create $IMAGE_NAME&quot;\n    exit 1\nfi<\/code><\/pre>\n<h2>\u4e09\u3001\u955c\u50cf\u6302\u8f7d<\/h2>\n<p>&emsp;&emsp;\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7<code>cat \/sys\/class\/block\/mmcblk0p7\/uevent<\/code>\u6765\u67e5\u770b<code>mmcblk0p7<\/code>\u5bf9\u5e94\u7684\u4fe1\u606f\uff1a<\/p>\n<pre><code class=\"language-sh\">root@HGD:\/# cat \/sys\/class\/block\/mmcblk0p7\/uevent \nMAJOR=179\nMINOR=7\nDEVNAME=mmcblk0p7\nDEVTYPE=partition\nPARTN=7\nPARTNAME=app<\/code><\/pre>\n<p>\u53ef\u4ee5\u770b\u5230\uff0c\u8be5\u5206\u533a\u5bf9\u5e94<code>app<\/code>\u3002<\/p>\n<p>&emsp;&emsp;\u6211\u4eec\u901a\u8fc7<code>mount<\/code>\u6765\u6302\u8f7d\u5206\u533a\uff1a<\/p>\n<pre><code class=\"language-sh\">mkdir -p \/app\nmount -t ext4 \/dev\/mmcblk0p7 \/app<\/code><\/pre>\n<p>&emsp;&emsp;\u6211\u4eec\u901a\u8fc7<code>umount<\/code>\u6765\u53d6\u6d88\u6302\u8f7d\uff0c\u4f7f\u7528<code>dd<\/code>\u6765\u5199\u5165\u5206\u533a\uff1a<\/p>\n<pre><code class=\"language-sh\">umount \/oemven\n# backup\ndd if=\/dev\/mmcblk0p8 of=oemven.img.bak bs=4M\n# write new\ndd if=oemven.img of=\/dev\/mmcblk0p8 bs=4M conv=fsync status=progress\nsync\nmount \/dev\/mmcblk0p8 \/oemven<\/code><\/pre>\n<p>&emsp;&emsp;\u4e0b\u9762\u662f\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u6302\u8f7d\u811a\u672c\uff1a<\/p>\n<pre><code class=\"language-sh\">#!\/bin\/sh -e\n# Auto mount partitions\n\n# \u5b9a\u4e49\u6302\u8f7d\u4fe1\u606f\nMOUNT_POINTS=&quot;\/app \/oemven \/userdata&quot;\nDEVICES=&quot;\/dev\/mmcblk0p7 \/dev\/mmcblk0p8 \/dev\/mmcblk0p9&quot;\n\n# \u521b\u5efa\u76ee\u5f55\u5e76\u6302\u8f7d\nmount_partitions() {\n    echo -n &quot;Mounting partitions... &quot;\n\n    # \u521b\u5efa\u6302\u8f7d\u70b9\uff08\u5982\u679c\u4e0d\u5b58\u5728\uff09\n    for mount_point in $MOUNT_POINTS; do\n        if [ ! -d &quot;$mount_point&quot; ]; then\n            mkdir -p &quot;$mount_point&quot;\n            if [ $? -ne 0 ]; then\n                echo &quot;Failed to create directory: $mount_point&quot;\n                return 1\n            fi\n        fi\n    done\n\n    # \u6302\u8f7d\u5206\u533a\n    mount -t ext4 \/dev\/mmcblk0p7 \/app\n    mount -t ext4 \/dev\/mmcblk0p8 \/oemven\n    mount -t ext4 \/dev\/mmcblk0p9 \/userdata\n\n    echo &quot;done.&quot;\n    return 0\n}\n\n# \u5378\u8f7d\u5206\u533a\numount_partitions() {\n    echo -n &quot;Unmounting partitions... &quot;\n\n    # \u9006\u5e8f\u5378\u8f7d\u5206\u533a\n    for device in $DEVICES; do\n        if mount | grep -q &quot;$device&quot;; then\n            umount &quot;$device&quot;\n            if [ $? -ne 0 ]; then\n                echo &quot;Failed to unmount: $device&quot;\n                return 1\n            fi\n        fi\n    done\n\n    echo &quot;done.&quot;\n    return 0\n}\n\n# \u68c0\u67e5\u6302\u8f7d\u72b6\u6001\ncheck_mounts() {\n    echo &quot;Checking mount status:&quot;\n    df -h | grep &quot;mmcblk0p[789]&quot;\n}\n\ncase &quot;$1&quot; in\n    start)\n        echo &quot;Starting auto mount...&quot;\n        mount_partitions\n        check_mounts\n        ;;\n    stop)\n        echo &quot;Stopping auto mount...&quot;\n        umount_partitions\n        ;;\n    restart|reload)\n        echo &quot;Restarting auto mount...&quot;\n        umount_partitions\n        mount_partitions\n        check_mounts\n        ;;\n    status)\n        check_mounts\n        ;;\n    *)\n        echo &quot;Usage: $0 {start|stop|restart|status}&quot;\n        exit 1\nesac\n\nexit 0<\/code><\/pre>\n<p>\u9664\u4e86\u4f7f\u7528\u811a\u672c\uff0c\u8fd8\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539fstab\u6765\u6302\u8f7d\u5206\u533a\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u3001\u5206\u533a\u8bbe\u7f6e \u539f\u59cb\u914d\u7f6e\uff1a FIRMWARE_VER: 1.0 MACHINE_MODEL: RK3588 MACHINE_ID:  &#8230;<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[46],"tags":[344],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/posts\/1600"}],"collection":[{"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/comments?post=1600"}],"version-history":[{"count":2,"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/posts\/1600\/revisions"}],"predecessor-version":[{"id":1602,"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/posts\/1600\/revisions\/1602"}],"wp:attachment":[{"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/media?parent=1600"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/categories?post=1600"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/tags?post=1600"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}