-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.json
1 lines (1 loc) · 21 KB
/
index.json
1
[{"content":"1. 开发缘由 本次是我第一次接触开发板嵌入式开发,原因是选修的嵌入式开发的课程要求在期末的时候在龙芯 2K500 的实验箱上部署一个DEMO。本文主要记录了我在部署开发环境时遇到的小坑,回头看其实只是因为不熟悉交叉编译和内核开发闹出的一些小笑话,不过也很有纪念意义,于是记录下来。\n接下来简单介绍一下龙芯 2K500:\n龙芯 2K500 芯片是一款基于 LoongArch64 架构的处理器,专为嵌入式应用设计。该 CPU 采用单核设计,拥有单个 LA264 处理器核心,主频范围在 500MHz 到800MHz 之间。CPU 缓存配置方面拥有 32KB 一级指令缓存、32KB 一级数据缓存、512KB 通用二级缓存。CPU 中内置 2D GPU 图形核心,支持 DVO 显示接口。\n在系统软件支持上,龙芯 2K500 运行 U-Boot 2022 和 Linux 5.10 内核,并兼容 Buildroot 2021 和 OpenHarmony 3.2 文件系统。\n从官网上来看,这款芯片主要是用于网关、物联网数据终端等设备。确实是一款嵌入式芯片。\n2. 踩坑记录 2.1 缺失内核源码 刚上手时,我甚至不知道交叉编译驱动还需要内核源码,在我简单的设置好 Loongarch 的 gcc 编译器以后,我就开始直接编译驱动了。在编译内核模块的目录里,我把Makefile 中的KDIR的含义理解为我当前要编译的驱动源码所在的的路径。\nobj-m :=ch422g.o KDIR :=/home/chenzheng/loongarch/mod all: make -C $(KDIR) M=$(PWD) modules clean: make -C $(KDIR) M=$(PWD) modules clean 显而易见,这是错误的,我应该把KDIR指向板子上的内核源码路径。所以我需要下载板子上的内核源码,然后交叉编译驱动。\n接下来我重新构建了我的工作目录,如下:\nloongarch ├── linux-5.10-2k500 ├── mod │ ├── ch422g.c │ ├── ch422g.h │ └── Makefile ├── test │ ├── ch422g_test.c │ └── Makefile └── setEnv.sh 并且修改了Makefile,如下:\nobj-m :=ch422g.o KDIR :=/home/chenzheng/loongarch/linux-5.10-2k500 all: make -C $(KDIR) M=$(PWD) modules clean: make -C $(KDIR) M=$(PWD) modules clean 2.2 编译驱动缺失Module.symvers 我在内核源码目录下,执行了 make loongson_2k500_defconfig 得到了.config,并执行了 make prepare 和make modules_prepare,但是我在编译模块时出现了警告:\nWARNING: Symbol version dump \u0026#34;Module.symvers\u0026#34; is missing.Modules may not have dependencies or modversions. MODPOST /home/chenzheng/loongarch/mod/Module.symvers WARNING: modpost: Symbol info of vmlinux is missing. Unresolved symbol check will be entirely skipped. CC [M] /home/chenzheng/loongarch/mod/ch422g.mod.o LD [M] /home/chenzheng/loongarch/mod/ch422g.ko make[1]: Leaving directory \u0026#39;/home/chenzheng/loongarch/kernel/linux-5.10-2k500-cbd-src\u0026#39; 接下来我执行了 make 命令,因为编译一整个内核,应该能解决 Module.symvers 缺失的问题,但是不知道为何没有解决。\n最终我参考了: How can I prepare a Linux source tree so an external module can be compiled against it? - StackOverflow\n得出了解决方案:\n# Prepare kernel source cd \u0026#39;/path/to/kernel/source\u0026#39; make localmodconfig # 这里就是我执行的 make loongson_2k500_defconfig make -j modules_prepare # 可以指定线程数目 如 -j8 # May also be needed if you need module versioning, # in which case modules_prepare is not enough make -j modules # 这一步必须要有,否则会出现 Module.symvers 缺失的问题 # Build your module against it cd \u0026#39;/path/to/your/module/source\u0026#39; make -j -C \u0026#39;/path/to/kernel/source\u0026#39; M=\u0026#34;$(pwd)\u0026#34; modules # Clean things up (will delete your .ko module so grab it and # move it somewhere else first) make -j -C \u0026#39;/path/to/kernel/source\u0026#39; M=\u0026#34;$(pwd)\u0026#34; clean cd \u0026#39;/path/to/kernel/source\u0026#39; make distclean 这次编译并没有出现 WARNING: modpost: Symbol info of vmlinux is missing. Unresolved symbol check will be entirely skipped. 的警告。\n2.3 编译的模块和板子上的内核版本不一致 但是我发现我编译的模块并不能在板子上insmod,报错的消息如下:\n[root@LS-GD usb] # insmod ch422g.ko [ 7701.520577] ch422g: disagrees about version of symbol module_layout insmod: ERROR: could not insert module ch422g.ko: Invalid module format 这个问题是由于我编译的模块和板子上的内核版本不一致导致的。在我拿到手以后,板子上就已经安装好了内核,而且其版本也也是5.10。但是问题比想象的要复杂,因为就算内核版本一致,只要板子上的内核和我手里的源码有一些地方不一样,也会出现这个符号对不上的问题。\n而我的水平还没能理解到底是哪里不一样会导致这样的问题。\n随后,我构思了两种解决方案:\n一是在板子上安装完全和编译环境一致的内核。\n二是用手头的源码重新编译内核。\n考虑到资源库中已经分别给出了内核源码和内核二进制文件,我可以使用二进制文件直接进行安装。\n首先,我手头的源码和二进制有两版,需要梳理下。如果两套开发工具链中给出的内核源码和二进制文件都不匹配,那么我就需要重新编译内核。\n“-” 前面的是网盘用户名,后面的是密码。 这俩资源都是从龙芯2K500开发板技术资料拿的\nmx****005 - 5yob 给出的源码名字是linux-5.10-master-src-a7f3115-build.20240617170629.tar.gz,内核二进制名字是linux-5.10-2k500-mini-dp-134e7872d-build.20240624201016.tar.gz。\n神*止水 - p1gi 给出的内核源码名字是linux-5.10-2k500-src-ce8ee9b-build.20221011141048.tar.gz,内核二进制名字是linux-5.10-2k500-mini-dp-ce8ee9b62-build.20221011081008.zip\nmx****005 中给出的内核源代码,执行make -j modules,会出现如下错误:\nmake[2]: *** No rule to make target \u0026#39;arch/loongarch/boot/dts/loongson/ls2k500_hl_mb.dtb\u0026#39;, needed by \u0026#39;__build\u0026#39;. Stop. scripts/Makefile.build:496: recipe for target \u0026#39;arch/loongarch/boot/dts/loongson\u0026#39; failed make[1]: *** [arch/loongarch/boot/dts/loongson] Error 2 Makefile:1805: recipe for target \u0026#39;arch/loongarch/boot/dts\u0026#39; failed make: *** [arch/loongarch/boot/dts] Error 2 make: *** Waiting for unfinished jobs.... 我经过一番学习后,认为是在arch/loongarch/boot/dts/loongson/目录下缺少了ls2k500_hl_mb.dts文件,所以我需要在这个目录下添加这个文件。\n同时我查看了arch/loongarch/boot/dts/loongson/Makefile,结果非常的Amazing:\ndtb-$(CONFIG_LOONGSON_2K500) += ls2k500_hl_mb.dtb ls2k500_mini_dp.dtb ls2k500_dayu400_mb.dtb ls2k500_modi_hct.dtb ls2k500_zhengtai_pcs1800_v10.dtb \\ ls2k500_jiaoqian_v10.dtb ls2k500_zjjz.dtb 这个Makefile表示了,如果内核配置中开启了CONFIG_LOONGSON_2K500,那么就会编译这些dtb文件。那也就意味着arch/loongarch/boot/dts/loongson/下应该有这些文件的源码(dts)。\n但是,我看了一下,里面只有ls2k500_mini_dp.dtb 和 ls2k500_dayu400_mb.dtb, 真是令人费解。\n也别想从另一版源码中拷贝过来,因为另一版里面只有ls2k500_mini_dp.dtb 和 ls2k500_hl_mb.dtb。\n那么,我就选择使用神*止水-p1gi给出的源码和二进制。\n然而,我发现神*止水-p1gi给出的uImage安装后,板子启动会出现错误\n[ 2.155683] stmmaceth 1f020000.ethernet: IRQ eth_wake_irq not found [ 2.161955] stmmaceth 1f020000.ethernet: IRQ eth_lpi not found [ 2.167905] stmmaceth 1f020000.ethernet: Cannot get CSR clock [ 2.173655] stmmaceth 1f020000.ethernet: PTP uses main clock [ 2.179307] stmmaceth 1f020000.ethernet: no reset control found [ 2.185643] stmmaceth 1f020000.ethernet: User ID: 0x11, Synopsys ID: 0x37 [ 2.192459] stmmaceth 1f020000.ethernet: DWMAC1000 [ 2.197332] stmmaceth 1f020000.ethernet: DMA HW capability register supported [ 2.204446] stmmaceth 1f020000.ethernet: RX Checksum Offload Engine supported [ 2.211576] stmmaceth 1f020000.ethernet: COE Type 2 [ 2.216442] stmmaceth 1f020000.ethernet: TX Checksum insertion supported [ 2.223121] stmmaceth 1f020000.ethernet: Wake-Up On Lan supported [ 2.229303] stmmaceth 1f020000.ethernet: Enhanced/Alternate descriptors [ 2.235905] stmmaceth 1f020000.ethernet: Enabled extended descriptors [ 2.242328] stmmaceth 1f020000.ethernet: Ring mode enabled [ 2.247830] stmmaceth 1f020000.ethernet: Enable RX Mitigation via HW Watchdog Timer [ 2.255470] stmmaceth 1f020000.ethernet: device MAC address 64:48:48:48:48:60 [ 2.271418] libphy: stmmac: probed [ 2.274835] Marvell 88E1510 stmmac-0:00: attached PHY driver [Marvell 88E1510] (mii_bus:phy_addr=stmmac-0:00, irq=POLL) [ 2.287255] stmmaceth 1f030000.ethernet: IRQ eth_wake_irq not found [ 2.293552] stmmaceth 1f030000.ethernet: IRQ eth_lpi not found [ 2.299534] stmmaceth 1f030000.ethernet: Cannot get CSR clock [ 2.305292] stmmaceth 1f030000.ethernet: PTP uses main clock [ 2.310944] stmmaceth 1f030000.ethernet: no reset control found 现在果然只能重新编译内核了吗?\n而且必须是用神*止水给出的源码,因为mx****005给出的源码存在设备树文件缺失的问题。\n2.4 裁剪内核源码 说实话我还太指望用神*止水给出的源码来编译一个能用在板子上的内核,因为有很大的可能编译出来的内核和他直接给出的内核是一样的,换句话说,很有可能上面说的中断问题。\n抱着试一试的心态,我从arch/loongarch/boot/dts/loongson/Makefile 里删掉了没有的设备树文件,最后变成了以下的样子。\n# SPDX-License-Identifier: GPL-2.0 dtb-$(CONFIG_LOONGSON64_GENERIC) += loongson3_ls7a.dtb dtb-$(CONFIG_LOONGSON_2K500) += ls2k500_hl_mb.dtb ls2k500_mini_dp.dtb dtb-$(CONFIG_LOONGSON_2K1000) = ls2k1000_jl_mb.dtb ls2k1000_jl_mb_mu.dtb ls2k1000_jl_mb_nodvo.dtb \\ ls2k1000_dp.dtb ls2k1000_dp_i2s.dtb ksec_hac_mb.dtb gbkpdm0_v10.dtb gbkpdm0_litong.dtb \\ ls2k1000_cl_mb.dtb ls2k1000_dp_test.dtb ls2k1000_dp_factory.dtb dtb-$(CONFIG_LOONGSON_2P500) += ls2p500_evb.dtb ls2p500_rsj_mb_v10.dtb dtb-$(CONFIG_LOONGSON_2K300) += ls2k300_mini_dp.dtb ls2k300_pai.dtb obj-y += $(patsubst %.dtb, %.dtb.o, $(dtb-y)) 然后我执行了`make -j modules, 期间出现了错误:\nloongarch64-linux-gnu-ld: arch/loongarch/loongson64/init.o: in function `.L23\u0026#39;: init.c:(.init.text+0x24c): undefined reference to `__dtb_ls2k500_dayu400_mb_begin\u0026#39; loongarch64-linux-gnu-ld: init.c:(.init.text+0x250): undefined reference to `__dtb_ls2k500_dayu400_mb_begin\u0026#39; loongarch64-linux-gnu-ld: init.c:(.init.text+0x250): undefined reference to `__dtb_ls2k500_dayu400_mb_begin\u0026#39; Makefile:1170: recipe for target \u0026#39;vmlinux\u0026#39; failed make: *** [vmlinux] Error 1 这个问题是由于我在Makefile中删除了ls2k500_dayu400_mb.dtb,但是在内核源码中的一些文件中引用了这个设备树文件,所以我需要在内核源码中删除这些引用。\n于是我把下面的文件修改了\narch/loongarch/include/asm/mach-loongson64/boot_param.h arch/loongarch/loongson64/init.c // arch/loongarch/include/asm/mach-loongson64/boot_param.h extern u32 __dtb_ls2k500_mini_dp_begin[]; //extern u32 __dtb_ls2k500_dayu400_mb_begin[]; // Line 109 extern u32 __dtb_ls2k1000_jl_mb_begin[]; // arch/loongarch/loongson64/init.c if (!strncmp(b_info.board_name, \u0026#34;LS2K500-MINI-DP\u0026#34;, 15)) fdt = \u0026amp;__dtb_ls2k500_mini_dp_begin; // else if (!strncmp(b_info.board_name, \u0026#34;LS2K500-DAYU400-MB\u0026#34;, 17)) //Line 240 // fdt = \u0026amp;__dtb_ls2k500_dayu400_mb_begin; else fdt = \u0026amp;__dtb_ls2k500_mini_dp_begin; for (i = 0; i \u0026lt; NR_CPUS; ++i) if (check_cpu_full_name_invaild(i)) __cpu_full_name[i] = cpu_ls2k500_name; 然后我再次执行make -j modules,编译成功。\n在这样一个准备好的内核源码下,我最终尝试了编译驱动(说实话我有赌的成分在,因为一旦不成功就得去编译神*止水的源码了)。\n那么最终结果是什么呢?\n[root@LS-GD usb]# insmod ch422g.ko [ 7198.305519] ch422g_init===\u0026gt;GPSET0_V:120a4480,---GPIN0_V:120ac478,---GPCTR0_V:120b4470,---GPMUX0_V120bc4d4 [ 7198.326928] ch422g_init1===\u0026gt;GPFSEL_read:6000,---GPFCTR_read:ffff9fff,---GPFMUX_read:10000000 [root@LS-GD usb]# ./test_ch422g test: fd=3 Test program is running, enter \u0026#34;help\u0026#34; for help. Countdown thread is running 说明这次编译好的内核模块和内核的版本对上了,那么我的开发环境终于算是搭建完毕了。\n3. 最终开发成果 最后我在实验箱上实现了一个闹钟程序,算是非常简单的应用了,只用到了数码管和蜂鸣器两个设备。不过这样的一个从无到有的开发过程还是非常有趣的。\n","permalink":"https://cipeizheng.github.io/posts/first-loongarch/","summary":"\u003ch2 id=\"1-开发缘由\"\u003e1. 开发缘由\u003c/h2\u003e\n\u003cp\u003e本次是我第一次接触开发板嵌入式开发,原因是选修的嵌入式开发的课程要求在期末的时候在龙芯 2K500 的实验箱上部署一个DEMO。本文主要记录了我在部署开发环境时遇到的小坑,回头看其实只是因为不熟悉交叉编译和内核开发闹出的一些小笑话,不过也很有纪念意义,于是记录下来。\u003c/p\u003e\n\u003cp\u003e接下来简单介绍一下龙芯 2K500:\u003c/p\u003e\n\u003cp\u003e龙芯 2K500 芯片是一款基于 LoongArch64 架构的处理器,专为嵌入式应用设计。该 CPU 采用单核设计,拥有单个 LA264 处理器核心,主频范围在 500MHz 到800MHz 之间。CPU 缓存配置方面拥有 32KB 一级指令缓存、32KB 一级数据缓存、512KB 通用二级缓存。CPU 中内置 2D GPU 图形核心,支持 DVO 显示接口。\u003c/p\u003e\n\u003cp\u003e在系统软件支持上,龙芯 2K500 运行 U-Boot 2022 和 Linux 5.10 内核,并兼容 Buildroot 2021 和 OpenHarmony 3.2 文件系统。\u003c/p\u003e\n\u003cp\u003e从官网上来看,这款芯片主要是用于网关、物联网数据终端等设备。确实是一款嵌入式芯片。\u003c/p\u003e\n\u003ch2 id=\"2-踩坑记录\"\u003e2. 踩坑记录\u003c/h2\u003e\n\u003ch3 id=\"21-缺失内核源码\"\u003e2.1 缺失内核源码\u003c/h3\u003e\n\u003cp\u003e刚上手时,我甚至不知道交叉编译驱动还需要内核源码,在我简单的设置好 Loongarch 的 gcc 编译器以后,我就开始直接编译驱动了。在编译内核模块的目录里,我把Makefile 中的KDIR的含义理解为我当前要编译的驱动源码所在的的路径。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-makefile\" data-lang=\"makefile\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eobj-m\u003c/span\u003e \u003cspan class=\"o\"\u003e:=\u003c/span\u003ech422g.o\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eKDIR\u003c/span\u003e \u003cspan class=\"o\"\u003e:=\u003c/span\u003e/home/chenzheng/loongarch/mod\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nf\"\u003eall\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e make -C \u003cspan class=\"k\"\u003e$(\u003c/span\u003eKDIR\u003cspan class=\"k\"\u003e)\u003c/span\u003e \u003cspan class=\"nv\"\u003eM\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003ePWD\u003cspan class=\"k\"\u003e)\u003c/span\u003e modules\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nf\"\u003eclean\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e make -C \u003cspan class=\"k\"\u003e$(\u003c/span\u003eKDIR\u003cspan class=\"k\"\u003e)\u003c/span\u003e \u003cspan class=\"nv\"\u003eM\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003ePWD\u003cspan class=\"k\"\u003e)\u003c/span\u003e modules clean\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e显而易见,这是错误的,我应该把KDIR指向板子上的内核源码路径。所以我需要下载板子上的内核源码,然后交叉编译驱动。\u003c/p\u003e","title":"从零开始的Loongson 2K500开发环境踩坑"},{"content":"This is my first post, I will write some markdown syntax here to show how it looks like. Most of the content below is copied from PaperMod\u0026rsquo;s Demo.\nParagraph 滚滚长江东逝水,浪花淘尽英雄。\n是非成败转头空。青山依旧在,几度夕阳红。\n白发渔樵江渚上,惯看秋月春风。\n一壶浊酒喜相逢。古今多少事,都付笑谈中。\n——调寄《临江仙》斋\n话说天下大势,分久必合,合久必分。周末七国分争,并入于秦。及秦灭之后,楚、汉分争,又并入于汉。汉朝自高祖斩白蛇而起义,一统天下,后来光武中兴,传至献帝,遂分为三国。推其致乱之由,殆始于桓、灵二帝。桓帝禁锢善类,崇信宦官。及桓帝崩,灵帝即位,大将军窦武、太傅陈蕃,共相辅佐。时有宦官曹节等弄权,窦武、陈蕃谋诛之,机事不密,反为所害,中涓自此愈横。\nBlockquotes The blockquote element represents content that is quoted from another source, optionally with a citation which must be within a footer or cite element, and optionally with in-line changes such as annotations and abbreviations.\nBlockquote without attribution Tiam, ad mint andaepu dandae nostion secatur sequo quae. Note that you can use Markdown syntax within a blockquote.\nBlockquote with attribution Don\u0026rsquo;t communicate by sharing memory, share memory by communicating.\n— Rob Pike1\nTables Tables aren\u0026rsquo;t part of the core Markdown spec, but Hugo supports them out-of-the-box.\nName Age Bob 27 Alice 23 Inline Markdown within tables Italics Bold Code italics bold code List Types Ordered List First item Second item Third item Unordered List List item Another item And another item Nested Unordered list Fruit Apple Orange Banana Dairy Milk Cheese Nested Ordered list Fruit Apple Orange Banana Dairy Milk Cheese Third item Sub One Sub Two Other Elements — abbr, sub, sup, kbd, mark GIF is a bitmap image format.\nH2O\nXn + Yn = Zn\nPress CTRL+ALT+Delete to end the session.\nMost salamanders are nocturnal, and hunt for insects, worms, and other small creatures.\nSummary This is a summary.\nThe above quote is excerpted from Rob Pike\u0026rsquo;s talk during Gopherfest, November 18, 2015.\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","permalink":"https://cipeizheng.github.io/posts/my-first-post/","summary":"\u003cp\u003eThis is my first post, I will write some markdown syntax here to show how it looks like. Most of the content below is copied from \u003ca href=\"https://github.com/adityatelange/hugo-PaperMod/tree/exampleSite\"\u003ePaperMod\u0026rsquo;s Demo\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"paragraph\"\u003eParagraph\u003c/h2\u003e\n\u003cp\u003e滚滚长江东逝水,浪花淘尽英雄。\u003c/p\u003e\n\u003cp\u003e是非成败转头空。青山依旧在,几度夕阳红。\u003c/p\u003e\n\u003cp\u003e白发渔樵江渚上,惯看秋月春风。\u003c/p\u003e\n\u003cp\u003e一壶浊酒喜相逢。古今多少事,都付笑谈中。\u003c/p\u003e\n\u003cp\u003e——调寄《临江仙》斋\u003c/p\u003e\n\u003cp\u003e话说天下大势,分久必合,合久必分。周末七国分争,并入于秦。及秦灭之后,楚、汉分争,又并入于汉。汉朝自高祖斩白蛇而起义,一统天下,后来光武中兴,传至献帝,遂分为三国。推其致乱之由,殆始于桓、灵二帝。桓帝禁锢善类,崇信宦官。及桓帝崩,灵帝即位,大将军窦武、太傅陈蕃,共相辅佐。时有宦官曹节等弄权,窦武、陈蕃谋诛之,机事不密,反为所害,中涓自此愈横。\u003c/p\u003e\n\u003ch2 id=\"blockquotes\"\u003eBlockquotes\u003c/h2\u003e\n\u003cp\u003eThe blockquote element represents content that is quoted from another source, optionally with a citation which must be within a \u003ccode\u003efooter\u003c/code\u003e or \u003ccode\u003ecite\u003c/code\u003e element, and optionally with in-line changes such as annotations and abbreviations.\u003c/p\u003e\n\u003ch3 id=\"blockquote-without-attribution\"\u003eBlockquote without attribution\u003c/h3\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTiam, ad mint andaepu dandae nostion secatur sequo quae.\n\u003cstrong\u003eNote\u003c/strong\u003e that you can use \u003cem\u003eMarkdown syntax\u003c/em\u003e within a blockquote.\u003c/p\u003e","title":"My 1st post"}]