陳彥丞
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Make a copy
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Make a copy Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    ###### tags: `TSC` `Linux` Create Standalone SDK from imx ===== # 前言 ## Key component 要讓 CPU 跑 linux 基本要有幾個組件 - Bootloader - Kernel - rootfs ### Bootloader ![](https://i.imgur.com/g5OZHb0.png) ### Files and binaries required in the boot partition: • flash.bin: Fit image containing U-Boot and the ATF • zImage: Kernel image • zImage-*.dtb: Device tree # Pre Setup :::danger 注意事項: 1. 編譯Yocto Project 官方文件提到 Linux Host 機器,硬碟空間至少要 ==120 GB== 2. 使用虛擬機(VM)建構硬碟/linux Host時,建議使用==固定大小==,不要使用動態分配 3. 建議使用 Ubuntu 18.04 or 相同的host linux 版本 ref: ![](https://i.imgur.com/PtaEt9K.png) ::: ## 安裝相依套件 ```bash= sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib \ build-essential chrpath socat cpio python python3 python3-pip python3-pexpect \ xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev \ pylint3 xterm rsync curl libncursesw5-dev libncurses5-dev ``` ## 配置 Git ```bash= git config --global user.name "<Your Name>" git config --global user.email "<Your Email>" git config --list ``` ## 配置 repo utility - Create a bin folder in the home directory. ```bash= mkdir ~/bin curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo ``` - Add the following line to the .bashrc file to ensure that the ~/bin folder is in your PATH variable. ```bash= export PATH=~/bin:$PATH > ~/.bashrc source ~/.bashrc ``` # 建立 Toolchain (使用 Yocto Project) 1. 建立 Yocto Project on imx-5.10.52-2.1.0 ```bash= mkdir imx-yocto-bsp cd imx-yocto-bsp repo init -u https://source.codeaurora.org/external/imx/imx-manifest -b imx-linux-hardknott -m imx-5.10.52-2.1.0.xml repo sync ``` 2. 建立yocto 設定檔 ``` usage: DISTRO=<distro name> MACHINE=<machine name> source imx-setup-release.sh -b <build dir> ``` - imx8mp-lpddr4-evk ```bash= DISTRO=fsl-imx-xwayland MACHINE=imx8mp-lpddr4-evk source imx-setup-release.sh -b imx8mp_build_xwayland ``` - imx8mmevk ```bash= DISTRO=fsl-imx-xwayland MACHINE=imx8mmevk source imx-setup-release.sh -b imx8mmevk_build_xwayland ``` :::info 執行會進行 EULA 簽署,輸入 y 即可 ![](https://i.imgur.com/P8vsaOI.png) > distro name: * fsl-imx-wayland : Wayland weston graphics. * fsl-imx-xwayland : Wayland graphics and X11. X11 applications using EGL are not supported. * ~~fsl-imx-fb : Frame Buffer graphics - no X11 or Wayland. Frame Buffer is not supported on i.MX 8.~~ > machine name: i.MX 8 * imx8qmmek * imx8qxpc0mek * imx8mqevk * imx8mm-lpddr4-evk * imx8mm-ddr4-evk * imx8mn-lpddr4-evk * imx8mn-ddr4-evk - [x] ==imx8mp-lpddr4-evk== * imx8mp-ddr4-evk * imx8dxl-lpddr4-evk * imx8mnddr3levk * imx8ulp-lpddr4-evk * imx8mmddr3lval ==> 編譯失敗 > 其他config 定義至 source/meta-xxx/conf/machine 的 xxx.conf example: imx8mmddr3lval in "/sources/meta-imx/meta-bsp/conf/machine" Restarting a build environment > If a new terminal window is opened or the machine is rebooted after a build directory is set up, the setup environment script should be used to set up the environment variables and run a build again. The full imx-setup-release.sh is not needed. ``` source setup-environment <build-dir> ``` ::: 3. 執行 bitbake > ==這個步驟需要等待 4~5 小時== - imx8mpevk ```bash= DISTRO=fsl-imx-xwayland MACHINE=imx8mp-lpddr4-evk bitbake imx-image-core -c populate_sdk ``` - imx8mmevk ```bash= DISTRO=fsl-imx-xwayland MACHINE=imx8mmevk bitbake imx-image-core -c populate_sdk ``` :::info 最後會在 ==tmp/deploy/sdk== 目錄下會產出 `fsl-xxxx.sh` (toolchain install Script file) ::: 4. 安裝 toolchain 執行 toolchain install script file example: ```bash= . /home/max/imx-yocto-bsp/imx8mp_build_xwayland/tmp/deploy/sdk/fsl-imx-xwayland-glibc-x86_64-core-image-minimal-cortexa53-crypto-imx8mpevk-toolchain-5.10-hardknott.sh ``` ![](https://i.imgur.com/qsTvnCP.png) :::info 預設安裝置 /opt 下 ::: 5. Start build environment run environment-setup script ```bash= . /opt/fsl-imx-xwayland/5.10-hardknott/environment-setup-cortexa53-crypto-poky-linux ``` or use source ```bash= source /opt/fsl-imx-xwayland/5.10-hardknott/environment-setup-cortexa53-crypto-poky-linux ``` 6. 確認 toolchain 是否安裝成功 ``` echo &env | grep -e ARCH= -e CROSS_COMPILE= -e SYSROOT= -e CC= ``` ![](https://i.imgur.com/cWmoEXV.png) :::warning 由於sdk 採用動態設定環境變數,若充新開啟 terminal ,請重新執行 'run environment-setup script ::: # 建立 Bootloader Bootloader 包含以下組件: - 1. SECO(Security Controller) - 2. ATF (ARM Trusted FW) - 3. U-BOOT ## 建置 SECO FW: Security Controller SECO: NXP 只提供 Binary file,主要啟動過程中的一些安全認證。 ```bash= wget http://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-imx-8.13.bin chmod a+x firmware-imx-8.13.bin ./firmware-imx-8.13.bin --auto-accept ``` 以下路徑會有所需的 bin 檔 firmware-imx-8.13/firmware/ddr/synopsys ![](https://i.imgur.com/hXScX6D.png) ## 建置 imx-atf atf: ARM Trusted FW [介紹](https://blog.csdn.net/Alex___Zhao/article/details/76794586) ### Only clone lf-5.10.52-2.1.0 branch ```bash= git clone -b lf-5.10.52-2.1.0 --single-branch https://source.codeaurora.org/external/imx/imx-atf/ ``` ### Make image `usage: make [PLAT=<platform>] [OPTIONS] [TARGET]` >detail please run ==make help== example build the bl31 binary image: ```bash= make clean PLAT=imx8mp LDFLAGS="" make -j $(nproc) PLAT=imx8mp bl31 ``` :::info PLAT: Platform define > imx Platform Path: imx-atf/plat/imx bl31: EL3 Firmware ::: 建置結果 ![](https://i.imgur.com/iLhMWCi.png) ## 建置 uboot-imx ### 下載 Only clone lf-5.10.52-2.1.0 branch ```bash= git clone -b lf-5.10.52-2.1.0 --single-branch https://source.codeaurora.org/external/imx/uboot-imx ``` ### 編譯 #### clean dist data ```bash= make distclean ``` #### make config file - for i.MX 8M Plus DDR4 EVK board ```bash= make imx8mp_ddr4_evk_defconfig ``` - for i.MX 8M Plus LPDDR4 EVK board ```bash= make imx8mp_evk_defconfig ``` - for i.MX 8M mini LPDDR4 EVK board ```bash= make imx8mm_evk_defconfig ``` - for i.MX 8M mini DDR3L val board ```bash= make imx8mm_ddr3l_val_defconfig ``` ![](https://i.imgur.com/hCj0b7P.png) #### make image ```bash= make -j $(nproc) ```` ![](https://i.imgur.com/SyMebpZ.png) ### make menuconfig :::info linux host (ubuntu should install libncurses5-dev) apt install libncurses5-dev ::: should check the compiler is valid ![](https://i.imgur.com/FNkbO2p.png) ### 所需檔案 :::info tools/mkimage spl/u-boot-spl.bin u-boot-nodtb.bin arch/arm/dts/imx8mm-ddr4-evk.dtb ::: ## 使用 imx-mkimage 建立 Bootloader image ### 下載 Only clone lf-5.10.52-2.1.0 branch ```bash= git clone -b lf-5.10.52-2.1.0 --single-branch https://source.codeaurora.org/external/imx/imx-mkimage ``` ### 首先需要複製 Bootloader image 所需的檔案 - uboot-imx ```bash= cp uboot-imx/tools/mkimage ./imx-mkimage/iMX8M/mkimage_uboot # for ddr4 copy cp uboot-imx/arch/arm/dts/imx8mp-ddr4-evk.dtb ./imx-mkimage/iMX8M/ cp uboot-imx/spl/u-boot-spl-ddr.bin ./imx-mkimage/iMX8M/ cp uboot-imx/u-boot-nodtb.bin ./imx-mkimage/iMX8M/ # for lpddr4 cp uboot-imx/arch/arm/dts/imx8mp-evk.dtb ./imx-mkimage/iMX8M/ cp uboot-imx/spl/u-boot-spl.bin ./imx-mkimage/iMX8M/ cp uboot-imx/u-boot-nodtb.bin ./imx-mkimage/iMX8M/ ``` - firmware-imx :::info for ddr4 copy - ddr4_dmem_1d.bin - ddr4_dmem_2d.bin - ddr4_imem_1d.bin - ddr4_imem_2d.bin ::: ```bash= cp firmware-imx-8.12/firmware/ddr/synopsys/ddr4_dmem_1d.bin ./imx-mkimage/iMX8M/ cp firmware-imx-8.12/firmware/ddr/synopsys/ddr4_dmem_2d.bin ./imx-mkimage/iMX8M/ cp firmware-imx-8.12/firmware/ddr/synopsys/ddr4_imem_1d.bin ./imx-mkimage/iMX8M/ cp firmware-imx-8.12/firmware/ddr/synopsys/ddr4_imem_2d.bin ./imx-mkimage/iMX8M/ ``` ``` cp firmware-imx-8.12/firmware/ddr/synopsys/ddr3_*.bin ./imx-mkimage/iMX8M/ ``` :::info for lpddr4 copy - lpddr4_pmu_train_1d_dmem_202006.bin - lpddr4_pmu_train_1d_imem_202006.bin - lpddr4_pmu_train_2d_dmem_202006.bin - lpddr4_pmu_train_2d_imem_202006.bin ::: ```bash= cp firmware-imx-8.12/firmware/ddr/synopsys/lpddr4_pmu_train_1d_dmem_202006.bin ./imx-mkimage/iMX8M cp firmware-imx-8.12/firmware/ddr/synopsys/lpddr4_pmu_train_1d_imem_202006.bin ./imx-mkimage/iMX8M cp firmware-imx-8.12/firmware/ddr/synopsys/lpddr4_pmu_train_2d_dmem_202006.bin ./imx-mkimage/iMX8M cp firmware-imx-8.12/firmware/ddr/synopsys/lpddr4_pmu_train_2d_imem_202006.bin ./imx-mkimage/iMX8M ``` - imx-atf ```bash= cp imx-atf/build/imx8mp/release/bl31.bin ./imx-mkimage/iMX8M/ ``` ## Make Bootloader image ```bash= cd imx-mkimage ``` run make help ``` usage make SOC=<SOC_TARGET> [TARGET] i.e. make SOC=iMX8QX flash Common Targets: Parts with SCU flash_scfw - Only boot SCU flash - SCU + AP flash_flexspi - SCU + AP (FlexSPI device) flash_nand - SCU + AP (NAND device) flash_cm4 - SCU + M4_0 TCM image flash_linux_m4 - SCU + AP (OPTEE) + M4_0 (and M4_1) TCM image flash_linux_m4_xip - SCU + AP (OPTEE) + M4_0 (and M4_1) FLASH XIP image flash_linux_m4_ddr - SCU + AP (OPTEE) + M4_0 (and M4_1) DDR image Parts w/o SCU flash_ddr3l_val - DisaplayPort FW + u-boot spl flash_ddr3l_val_no_hdmi - u-boot spl flash_hdmi_spl_uboot - HDMI FW + u-boot spl flash_dp_spl_uboot - DisaplayPort FW + u-boot spl flash_spl_uboot - u-boot spl Typical flash cmd: dd if=iMX8QM/flash.bin of=/dev/<your device> bs=1k seek=33 ``` - for DDR4 - iMX8M Plus ```bash= make SOC=iMX8MP flash_ddr4_evk ``` - iMX8M Mini ```bash= make SOC=iMX8MM flash_ddr4_evk ``` - for LPDDR4 - iMX8M Plus ```bash= make SOC=iMX8MP flash_evk ``` - iMX8M Mini ```bash= make SOC=iMX8MM flash_evk ``` - for LPDDR3L - iMX8M Mini ```bash= make SOC=iMX8MM flash_ddr3l_evk ``` 建置成功將於 `imx-mkimage/iMX8M` 輸出 ==flash.bin== ![](https://i.imgur.com/wA3TtZg.png) ## make parameter in soc.mak file - imx8mp ::: info PLAT = imx8mp HDMI = no SPL_LOAD_ADDR = 0x920000 SPL_FSPI_LOAD_ADDR = 0x920000 TEE_LOAD_ADDR = 0x56000000 ATF_LOAD_ADDR = 0x00970000 VAL_BOARD = val #define the F(Q)SPI header file QSPI_HEADER = ../scripts/fspi_header QSPI_PACKER = ../scripts/fspi_packer.sh VERSION = v2 LPDDR_FW_VERSION = _202006 DDR_FW_VERSION = _202006 ::: - imx8mm ::: info PLAT = imx8mm HDMI = no SPL_LOAD_ADDR = 0x7E1000 SPL_FSPI_LOAD_ADDR = 0x7E2000 TEE_LOAD_ADDR ?= 0xbe000000 ATF_LOAD_ADDR = 0x00920000 VAL_BOARD = val #define the F(Q)SPI header file QSPI_HEADER = ../scripts/fspi_header 0 QSPI_PACKER = ../scripts/fspi_packer.sh VERSION = v1 ::: # 編譯 linux kernel ## 下載 Only clone lf-5.10.52-2.1.0 branch ```bash= git clone -b lf-5.10.52-2.1.0 --single-branch https://source.codeaurora.org/external/imx/linux-imx ``` ## 編譯 ```bash= make distclean make imx_v8_defconfig make -j $(nproc) Image dtbs ``` :::info “error : openssl/bio.h :No such file or folder” sudo apt install libssl-dev ::: ## 所需檔案: ```shell= ## device tree binary arch/arm64/boot/dts/freescale/*imx8mp*.dtb ## Kernal image arch/arm64/boot/Image ``` # rootfs 1. 直接下載Nxp官方編譯好的 (需要登入) https://www.nxp.com/webapp/sps/download/license.jsp?colCode=L5.10.35_2.0.0_MX8MP&appType=file1&location=null&DOWNLOAD_ID=null # 燒錄 ``` # The disk layout used is: # - ---------- -------------- -------------- # | | imx-boot | boot | rootfs | # - ---------- -------------- -------------- # ^ ^ ^ ^ ^ # | | | | | # 0 | 8MiB 72MiB 72MiB + rootfs + IMAGE_EXTRA_SPACE (default 10MiB) # 32 32 or 33kiB, see reference manual ``` 請參考 Linux Image 製作方式 https://hackmd.io/NhzRJ7rqTeuBoc4iEhy4yg ## bootloader ``` dd if=<boot_image> of=/dev/sd<x> bs=1k seek=<offset> conv=fsync ``` example: - iMX 8M Plus ``` dd if=flash.bin of=/dev/sdb bs=1k seek=32 conv=fsync ``` - iMX 8M Mini ``` dd if=flash.bin of=/dev/sdb bs=1k seek=33 conv=fsync ``` ``` Where: • offset is: — 1 - for i.MX 6 or i.MX 7 — 33 - for i.MX 8QuadMax A0, i.MX 8QuadXPlus A0, i.MX 8M Quad, i.MX 8M Mini — 32 - for i.MX 8QuadXPlus B0, i.MX 8QuadMax B0, i.MX 8DXL, i.MX 8M Nano, and i.MX 8M Plus • sd<x> is: — Device node for the SD card • boot_image is: — u-boot.imx - for i.MX 6 or i.MX 7 — flash.bin - for i.MX8 ``` ## kernel image ```bash= sudo dd if=<zImageName> of=/dev/sd<partition> bs=512 seek=2048 conv=fsync && sync ``` ## kernel devicetree ```bash= sudo dd if=<DevicetreeName>.dtb of=/dev/sd<partition> bs=512 seek=20480 conv=fsync ``` # 參考資料 https://github.com/SolidRun/imx8mp_build/blob/master/runme.sh https://coldnew.github.io/9cbf4b94/ iMX8QXP BSP Standalone Building Up https://www.wpgdadatong.com/tw/blog/detail?BID=B1395 LF5.10.35_2.0.0 IMX_LINUX_RELEASE_NOTES https://www.nxp.com/docs/en/release-note/IMX_LINUX_RELEASE_NOTES.pdf IMX_YOCTO_PROJECT_USERS_GUIDE https://www.nxp.com/docs/en/user-guide/IMX_YOCTO_PROJECT_USERS_GUIDE.pdf https://www.nxp.com/search?keyword=%2520L5.10.35&start=0&TARGET=https%253A%252F%252Fwww.nxp.com%252Fsearch%253Fkeyword%253DL5.10%2526start%253D0%2526&SAMLart=AAFSsPYAkNKN6Mb0Q6Li8D8gawrtLDPEJ99b3OIofvIALYpynjEcWdWa imx8m mini 中如何手动将kernel和dtb拷贝到eMMC上 https://www.wpgdadatong.com/tw/blog/detail?BID=B1656 在Imx8m mini 上通过TFTP实现NFS启动 https://www.wpgdadatong.com/tw/blog/detail?BID=B1503 imx8m mini中jailhouse hypervisor的应用 https://www.wpgdadatong.com/tw/blog/detail?BID=B2215 【ATU Book-i.MX8系列】 NXP i.MX8M Mini 環境建置 https://www.wpgdadatong.com/tw/blog/detail?BID=B1134 https://www.wpgdadatong.com/tw/profile?uid=64902&type=blogPost&timeSort=2&title=blogPost https://www.wpgdadatong.com/tw/profile?uid=60572&type=blogPost&timeSort=2&title=blogPost https://www.wpgdadatong.com/cn/profile?uid=66412&type=blogPost&timeSort=2&title=blogPost https://www.wpgdadatong.com/tw/profile?uid=62865&type=blogPost&timeSort=2&title=blogPost https://www.wpgdadatong.com/tw/profile?uid=72266&type=blogPost&timeSort=2&title=blogPost https://www.wpgdadatong.com/tw/profile?uid=64710&type=blogPost&timeSort=2&title=blogPost https://www.wpgdadatong.com/tw/profile?uid=60836&type=blogPost&timeSort=2&title=blogPost https://www.wpgdadatong.com/tw/profile?uid=60459&type=blogPost&timeSort=2&title=blogPost ## 构建 i.MX8 Yocto BSP 镜像 https://getiot.tech/imx8/build-imx-yocto-bsp-image.html ## Test Report vA0076 http://ess-wiki.advantech.com.tw/view/Test_Report_vA0076 iMX8QXP BSP Standalone Building Up https://www.wpgdadatong.com/tw/blog/detail?BID=B1395

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully