娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

【IMX6ULL學習筆記】二、U-Boot命令合集

發布者:SparklingEyes最新更新時間:2025-03-05 來源: cnblogs關鍵字:U-Boot 手機看文章 掃描二維碼
隨時隨地手機看文章

mmc erase blk# cnt

blk 為要擦除的起始塊,cnt 是要擦除的數量。沒事不要用 mmc erase 擦除 MMC 設備!

七、FAT 格式文件系統操作命令

有時候需要在 uboot 中對 SD 卡或者 EMMC 中存儲的文件進行操作,這時候就要用到文件操作命令,跟文件操作相關的命令有:fatinfo、fatls、fstype、fatload 和 fatwrite,但是這些文件操作命令只支持 FAT 格式的文件系統!

1、fatinfo 命令

fatinfo 命令用于查詢指定 MMC 設備分區的文件系統信息,格式如下:

fatinfo  []

interface 表示接口,比如 mmc,dev 是查詢的設備號,part 是要查詢的分區。比如我們要查詢 EMMC 分區 1 的文件系統信息,命令如下:

fatinfo mmc 1:1

image

2、fatls 命令

fatls 命令用于查詢 FAT 格式設備的目錄和文件信息,命令格式如下:

fatls  [] [directory]

interface 是要查詢的接口,比如 mmc,dev 是要查詢的設備號,part 是要查詢的分區,directory是要查詢的目錄。比如查詢 EMMC 分區 1 中的所有的目錄和文件,輸入命令:

fatls mmc 1:1

image

3、fstype 命令

fstype 用于查看 MMC 設備某個分區的文件系統格式,命令格式如下:

fstype  :

EMMC 核心板上的 EMMC 默認有 3 個分區,我們來查看一下這三個分區的文件
系統格式,輸入命令:

fstype mmc 1:0fstype mmc 1:1fstype mmc 1:2

image
分區 0 格式未知,因為分區 0 存放的 uboot,并且分區 0 沒有格式化,所以文件系統格式未知。分區 1 的格式為 fat,分區 1 用于存放 linux 鏡像和設備樹。分區 2 的格式為 ext4,用于存放 Linux 的根文件系統(rootfs)。

4、fatload 命令

fatload 命令用于將指定的文件讀取到 DRAM 中,命令格式如下:

fatload  [ [ [ [bytes [pos]]]]]

interface 為接口,比如 mmc,dev 是設備號,part 是分區,addr 是保存在 DRAM 中的起始地址,filename 是要讀取的文件名字。bytes 表示讀取多少字節的數據,如果 bytes 為 0 或者省略的話表示讀取整個文件。pos 是要讀的文件相對于文件首地址的偏移,如果為 0 或者省略的話表示從文件首地址開始讀取。我們將 EMMC 分區 1 中的 zImage 文件讀取到 DRAM 中的0X80800000 地址處,命令如下:

fatload mmc 1:1 80800000 zImage

image

5、fatwrite 命令

uboot 默認沒有使能 fatwrite 命令,需要修改板子配置頭文件,比如 mx6ullevk.h、mx6ull_alientek_emmc.h 等等,板子不同,其配置頭文件也不同。找到自己開發板對應的配置頭文件然后添加如下一行宏定義來使能 fatwrite 命令:

#define CONFIG_FAT_WRITE	/* 使能 fatwrite 命令 */

fatwirte 命令用于將 DRAM 中的數據寫入到 MMC 設備中,命令格式如下:

fatwrite     

interface 為接口,比如 mmc,dev 是設備號,part 是分區,addr 是要寫入的數據在 DRAM中的起始地址,filename 是寫入的數據文件名字,bytes 表示要寫入多少字節的數據。

可以通過 fatwrite 命令在 uboot 中更新 linux 鏡像文件和設備樹。以更新 linux 鏡像文件 zImage為例,首先將開發板提供的 zImage 鏡像文件拷貝到 Ubuntu 中的tftpboot 目錄下,拷貝完成以后使用命令 tftp 將 zImage 下載到 DRAM 的 0X80800000地址處,命令如下:

tftp 80800000 zImage

image
zImage 大小為 6785272(0X6788f8)個字節,接下來使用命令 fatwrite 將其寫入到 EMMC 的分區 1 中,文件名字為 zImage,命令如下:

fatwrite mmc 1:1 80800000 zImage 6788f8

image
使用“fatls”命令查看一下 EMMC 分區 1 里面的文件:
image

八、EXT 格式文件系統操作命令

uboot 有 ext2 和 ext4 這兩種格式的文件系統的操作命令,常用的就四個命令,分別為:ext2load、ext2ls、ext4load、ext4ls 和 ext4write。這些命令的含義和使用與fatload、fatls 和 fatwrite 一樣。

比如 ext4ls 命令,EMMC 的分區 2 就是 ext4格式的,使用 ext4ls 就可以查詢 EMMC 的分區 2 中的文件和目錄,輸入命令:

ext4ls mmc 1:2

image
ext 格式文件系統其他命令的操作可以參考FAT相對應的命令。

九、NAND 操作命令

uboot 是支持 NAND Flash 的,所以也有 NAND Flash 的操作命令,前提是使用的 NAND 版本的核心板,并且編譯 NAND 核心板對應的 uboot,然后使用 imxdownload 軟件將 u-boot.bin 燒寫到 SD 卡中,最后通過 SD 卡啟動。一般情況下 NAND 版本的核心板已經燒寫好了 uboot、linux kernel 和 rootfs 這些文件,所以可以將 BOOT 撥到 NAND,然后直接從 NAND Flash 啟動即可。

NAND 版核心板啟動信息如圖所示:
image
從圖中可以看出,當前開發板的 NAND 容量為 512MiB。輸入“? nand”即可查看
NAND 相關命令,如圖所示:
image
本節講解一些常用的命令。

1、nand info 命令

此命令用戶打印 NAND Flash 信息,輸入“nand info”,結果如圖所示:
image

圖中給出了 NAND 的頁大小、OOB 域大小,擦除大小等信息。


2、nand device 命令

nand device 用于切換 NAND Flash,如果你的板子支持多片 NAND 的話就可以使用此命令來設置當前所使用的 NAND。這個需要你的 CPU 有兩個 NAND 控制器,并且兩個 NAND 控制器各接一片 NAND Flash。就跟 I.MX6U 有兩個 SDIO 接口,這兩個 SDIO 接口可以接兩個 MMC設備一樣。不過一般情況下 CPU 只有一個 NAND 接口,而且在使用中只接一片 NAND。


3、nand erase 命令

nand erase 命令用于擦除 NAND Flash,NAND Flash 的特性決定了在向 NAND Flash 寫數據之前一定要先對要寫入的區域進行擦除。“nand erase”命令有三種形式:


nand erase[.spread] [clean] off size //從指定地址開始(off)開始,擦除指定大小(size)的區域。nand erase.part [clean] partition    //擦除指定的分區nand erase.chip [clean]              //全篇擦除

NAND 的擦除命令一般是配合寫命令的,后面講解 NAND 寫命令的時候在演示如何使用“nand erase”。


4、nand write 命令

此命令用于向 NAND 指定地址寫入指定的數據,一般和“nand erase”命令配置使用來更新 NAND 中的 uboot、linux kernel 或設備樹等文件,命令格式如下:


nand write addr off size

addr 是要寫入的數據首地址,off 是 NAND 中的目的地址,size 是要寫入的數據大小。


由于 I.MX6ULL 要求 NAND 對應的 uboot 可執行文件還需要另外包含 BCB 和 DBBT,因此直接編譯出來的 uboot.imx 不能直接燒寫到 NAND 里面。關于 BCB 和 DBBT 的詳細介紹請參考《I.MX6ULL 參考手冊》的 8.5.2.2 小節,筆者目前沒有詳細去研究 BCB 和 DBBT,因此不能在 NAND 版的 uboot 里面更新 uboot 自身。除非大家去研究一下 I.MX6ULL 的 BCB 和 DBBT,然后在 u-boot.imx 前面加上相應的信息,否則即使將 uboot 燒進去了也不能運行。使用 mfgtool 燒寫系統到 NAND 里面的時候,mfgtool 會使用一個叫做“kogs-ng”的工具完成 BCB 和 DBBT 的添加。

但是可以在 uboot 里面使用“nand write”命令燒寫 kernel 和 dtb。先編譯出來 NAND 版本的 kernel 和 dtb 文件,在燒寫之前要先對 NAND 進行分區,也就是規劃好 uboot、linux kernel、設備樹和根文件系統的存儲區域,I.MX6U-ALPHA 開發板出廠系統 NAND 分區如下:


0x000000000000-0x0000003FFFFF : 'boot'0x000000400000-0x00000041FFFF : 'env'0x000000420000-0x00000051FFFF : 'logo'0x000000520000-0x00000061FFFF : 'dtb'0x000000620000-0x000000E1FFFF : 'kernel'0x000000E20000-0x000020000000 : 'rootfs'

一共有六個分區:

第一個分區存放 uboot,地址范圍為 0x0~0x3FFFFF(共 4MB);

第二個分區存放 env(環境變量),地址范圍 0x400000~0x420000(共 128KB);

第三個分區存放 logo(啟動圖標),地址范圍為 0x420000~0x51FFFF(共 1MB);

第四個分區存放 dtb(設備樹),地址范圍為 0x520000~0x61FFFF(共 1MB);

第五個分區存放 kernel(linux),地址范圍為0x620000~0xE1FFFF(共 8MB);

剩下的所有存儲空間全部作為最后一個分區,存放 rootfs(根文件系統)。


可以看出 kernel 是從地址 0x620000 開始存放的,將 NAND 版本 kernel 對應的 zImage 文件放到 Ubuntu 中的 tftpboot 目錄中,然后使用 tftp 命令將其下載到開發板的 0X87800000 地址處,最終使用“nand write”將其燒寫到 NAND 中,命令如下:


tftp 0x87800000 zImage                  //下載 zImage 到 DRAM 中nand erase 0x620000 0x800000            //從地址 0x620000 開始擦除 8MB 的空間nand write 0x87800000 0x620000 0x800000 //將接收到的 zImage 寫到 NAND 中

這里擦除了 8MB 的空間,因為一般 zImage 就是 6,7MB 左右,8MB 肯定夠了,如果不夠的話就再多擦除一點就行了。


同理,最后燒寫設備樹(dtb)文件文件,命令如下:


tftp 0x87800000 imx6ull-14x14-emmc-7-1024x600-c.dtb //下載 dtb 到 DRAM 中nand erase 0x520000 0x100000            //從地址 0x520000 開始擦除 1MB 的空間nand write 0x87800000 0x520000 0x100000 //將接收到的 dtb 寫到 NAND 中

dtb 文件一般只有幾十 KB,所以擦除 1M 是綽綽有余的了。注意!出廠系統在 NAND 里面燒寫了很多種設備樹文件!這里只是舉例燒寫一種的方法,在實際產品開發中肯定只有一種設備樹。

根文件系統(rootfs)就不要在 uboot 中更新了,還是使用 NXP 提供的 Mfgtool 工具來燒寫,因為根文件系統太大!很有可能超過開發板 DRAM 的大小,這樣連下載都沒法下載,更別說更新了。


4、nand read 命令

此命令用于從 NAND 中的指定地址讀取指定大小的數據到 DRAM 中,格式如下:


nand read addr off size

addr 是目的地址,off 是要讀取的 NAND 中的數據源地址,size 是要讀取的數據大小。比如讀取設備樹(dtb)文件到 0x83000000 地址處,命令如下:


nand read 0x83000000 0x520000 0x19000

過程如圖所示:

image

設備樹文件讀取到 DRAM 中以后就可以使用 fdt 命令來對設備樹進行操作了,首先設置 fdt 的地址,fdt 地址就是 DRAM 中設備樹的首地址,命令如下:


fdt addr 83000000

設置好以后可以使用“fdt header”來查看設備樹的頭信息,輸入命令:


fdt header

結果如圖所示:

image
輸入命令“fdt print”就可以查看設備樹文件的內容,輸入命令:

fdt print

結果如圖所示:
image

NAND 常用的操作命令就是擦除、讀和寫,至于其他的命令大家可以自行研究一下,一定不要嘗試全片擦除 NAND 的指令!否則 NAND 就被全部擦除掉了,什么都沒有了,又得重頭燒整個系統。


十、SPI FLASH操作命令

uboot 中如果支持 spi/qspi flash, 那么可以使用 sf 的 erase、read、write 命令操作spi flash。


sf read   //用來讀取flash數據到內存sf write  //寫內存數據到flashsf erase  //擦除指定位置,指定長度的flash內容, 擦除后內容全1

具體用法:


sf probe [[bus:]cs] [hz] [mode] - init flash device on given SPI bus and chip selectsf read addr offset len    - read `len' bytes starting at`offset' to memory at `addr'sf write addr offset len   - write `len' bytes from memor at `addr' to flash at `offset'sf erase offset [+]len     - erase `len' bytes from `offset' `+len' round up `len' to block sizesf update addr offset len  - erase and write `len' bytes from memory at `addr' to flash at `offset'

使用范例:

在使用sf read sf write之前,一定要調用sf probe


sf probe

寫數據


sf write 0x82000000 0x0 0x20000  //把內存 0x82000000 處的數據, 寫入 flash 的偏移 0x0, //寫入數據長度為 0x20000(128KB), 操作偏移和長度最小單位是 Byte

讀數據


sf read 0x82000000 0x10000 0x20000//把 flash 偏移 0x10000(64KB) 處, 長度為 0x20000(128KB) 的數據, //寫入到內存 0x82000000, 操作偏移和長度最小單位是 Byte

擦除數據


sf erase 0x0 0x10000//擦除偏移0x0處, 到0x10000之間的擦除塊, 擦除操作是以erase block為單位的,// 要求 offset 和 len 參數必須是 erase block 對齊的

從sf命令,可以看出幾點:


spi flash 沒有 oob 數據存在, 不用考慮EDC ECC, 也沒有壞塊管理概念.


支持Byte級的讀寫操作, 支持隨機訪問.


十一、BOOT 操作命令

uboot 的本質工作是引導 Linux,所以 uboot 肯定有相關的 boot(引導)命令來啟動 Linux。常用的跟 boot 有關的命令有:bootz、bootm 和 boot。


1、bootz 命令

要啟動 Linux,需要先將 Linux 鏡像文件拷貝到 DRAM 中,如果使用到設備樹的話也需要將設備樹拷貝到 DRAM 中。可以從 EMMC 或者 NAND 等存儲設備中將 Linux 鏡像和設備樹文件拷貝到 DRAM,也可以通過 nfs 或者 tftp 將 Linux 鏡像文件和設備樹文件下載到 DRAM 中。不管用那種方法,只要能將 Linux 鏡像和設備樹文件存到 DRAM 中就行,然后使用 bootz 命令來啟動,bootz 命令用于啟動 zImage 鏡像文件,bootz 命令格式如下:


bootz [addr [initrd[:size]] [fdt]]

命令 bootz 有三個參數,addr 是 Linux 鏡像文件在 DRAM 中的位置,initrd 是 initrd 文件在DRAM 中的地址,如果不使用 initrd 的話使用 ‘-’ 代替即可,fdt 就是設備樹文件在 DRAM 中的地址。


TFTP啟動:Linux 鏡像文件和設備樹都準備好,使用 tftp 命令將 zImage 下載到 DRAM 的 0X80800000 地址處,然后將設備樹imx6ull-14x14-emmc-7-1024x600-c.dtb 下載到 DRAM 中的 0X83000000 地址處,最后之后命令 bootz 啟動,命令如下:


tftp 80800000 zImagetftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtbbootz 80800000 - 83000000

image

EMMC啟動:要從 EMMC 中啟動 Linux 系統,先切換到emmc設備,使用命令 fatls 查看要下 EMMC 的分區 1 中有沒有 Linux 鏡像文件和設備樹文件。再使用命令 fatload 將 zImage 和 imx6ull-14x14-emmc-7-1024x600-c.dtb 文件拷貝到 DRAM 中,地址分別為 0X80800000 和 0X83000000,最后使用 bootz 啟動,命令如下:


mmc dev 1fatload mmc 1:1 80800000 zImagefatload mmc 1:1 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtbbootz 80800000 - 83000000

image

2、bootm 命令

bootm 和 bootz 功能類似,但是 bootm 用于啟動 uImage 鏡像文件。如果不使用設備樹的話啟動 Linux 內核的命令如下:


bootm addr

addr 是 uImage 鏡像在 DRAM 中的首地址。

如果要使用設備樹,那么 bootm 命令和 bootz 一樣,命令格式如下:


bootm [addr [initrd[:size]] [fdt]]

其中 addr 是 uImage 在 DRAM 中的首地址,initrd 是 initrd 的地址,fdt 是設備樹(.dtb)文件在 DRAM 中的首地址,如果 initrd 為空的話,同樣是用 “-” 來替代。


3、boot 命令

boot 命令也是用來啟動 Linux 系統的,只是 boot 會讀取環境變量 bootcmd 來啟動 Linux 系統,bootcmd 是一個很重要的環境變量,這個環境變量保存著引導命令,其實就是啟動的命令集合,具體的引導命令內容是可以修改的。


使用 tftp 命令從網絡啟動 Linux 那么就可以設置 bootcmd 為:


setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb; bootz 80800000 - 83000000'

然后使用 saveenv 將 bootcmd 保存起來:


saveenv

然后直接輸入 boot 命令即可從網絡啟動Linux 系統:


boot

image

uboot 倒計時結束以后就會啟動 Linux 系統,其實就是執行的 bootcmd 中的啟動

命令。只要不修改 bootcmd 中的內容,以后每次開機 uboot 倒計時結束以后都會使用 tftp 命令從網絡下載 zImage 和 imx6ull-14x14-emmc-7-1024x600-c.dtb,然后啟動 Linux。


如果想從 EMMC 啟動,首先切換到emmc:


mmc dev 1

然后設置 bootcmd 為:


setenv bootcmd 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb; bootz 80800000 - 83000000'

然后保存并使用 boot命令啟動即可:


savenevboot

image

如果不修改 bootcmd 的話,每次開機 uboot 倒計時結束以后都會自動從 EMMC 里面讀取 zImage 和 imx6ull-14x14-emmc-7-1024x600-c.dtb,然后啟動 Linux。


在啟動 Linux 內核的時候可能會遇到如下錯誤:


“Kernel panic – not Syncing: VFS: Unable to mount root fs on unknown-block(0,0)”

這個錯誤的原因是 linux 內核沒有找到根文件系統,因為沒有設置 uboot 的 bootargs 環境變量,關于 bootargs 環境變量后面會講解。

[1] [2] [3]
關鍵字:U-Boot 引用地址:【IMX6ULL學習筆記】二、U-Boot命令合集

上一篇:【IMX6ULL學習筆記】三、U-BOOT Makefile詳解
下一篇:【IMX6ULL學習筆記】一、Linux開發環境搭建

推薦閱讀最新更新時間:2025-04-24 21:56

迅為IMX6ULL開發板Linux蜂鳴器實驗
在上一章講解了添加 LED 燈驅動的整個流程和測試結果,這一章在來看一下蜂鳴器的驅動,蜂鳴器和LED 燈的驅動其實是一樣的,都是控制 GPIO 引腳輸出高低電平,在本章繼續學習一下蜂鳴器的驅動,也算是在鞏固一遍驅動的添加流程。 37.1 蜂鳴器設備注冊流程 蜂鳴器設備注冊流程 和 LED 燈驅動注冊一樣,蜂鳴器注冊流程也分為下面幾步: 5 硬件原理圖分析,確定控制 LED 的 GPIO 信息。 6 根據 GPIO 信息在設備樹文件中添加 pinctrl 信息 7 在設備樹中創建 LED 的設備節點,并加入 GPIO 信息 8 編寫 LED 設備驅動程序 接下來根據上面這四步來添加一下蜂鳴器的設備驅動。 2 37.2 蜂鳴器硬件原理
[單片機]
迅為<font color='red'>IMX6ULL</font>開發板Linux蜂鳴器實驗
TQ2440 使用Jlink-Flasher 燒寫 u-boot 或者 program
目前有三種方式來燒寫 1、使用SJF2440 軟件,配合 PC并口,這種方法最原始,效率低下,并且PC 必須有并口,現在的電腦一般都沒有,筆記本就更加不用說啦! 2、使用H-Jtag 軟件,配合PC并口,對于有PC 并口的,可以推薦下,但是一般都是沒有的! 3、使用Jlink 軟件,PC 端沒有并口,我們一般都采用這種方法,特別是筆記本電腦。 TQ2440 買回來的時候是有u-boot 的,此后我們可以選擇是從Nor Flash 啟動或者 NAND Flash 啟動,并且可以通過 USB 燒寫。但如果一旦 u-boot 損壞了,或者其他原因,就會導致不能下在程序。我就遇到了這樣的問題! 買了個 J-Link A
[單片機]
TQ2440 使用Jlink-Flasher 燒寫 <font color='red'>u-boot</font> 或者 program
u-boot配置和編譯過程詳解
備注:分析的是OK210開發板自帶的uboot_smdkv210,可能有些部分和其他版本不太一樣,但是原理都類似。 編譯u-boot的步驟 make forlinx_linux_configmake1212 首先生成配置文件,然后編譯源碼,依次看看這些命令都干了些什么事情 配置過程 #forlinx addforlinx_linux_config : unconfig @$(MKCONFIG) $(@:_config=) arm s5pc11x smdkc110 samsung s5pc110 linux @echo TEXT_BASE = 0xcc800000 $(obj)board/samsung/smdkc110
[單片機]
u-boot-2011.03在mini2440/micro2440上的移植 支持Nand Flash啟動
7.1 創建nand_read.c 【注意】 本程序只能用于讀取2K/頁的Nand。本人的Micro2440上的Nand Flash為256M,型號為K9F2G08 $ touch board/samsung/micro2440/nand_read.c $ cat board/samsung/micro2440/nand_read.c #define rNFCONF (*(volatile unsigned *)0x4E000000) #define rNFCONT (*(volatile unsigned *)0x4E000004) #define rNFCMD (*(volatile unsigned *)0x4E00
[單片機]
OK6410A 開發板 (三) 3 u-boot-2021.01 boot 解析概覽
// 需要分析的一套過程 1.配置文件分析 2.配置過程分析 3.編譯過程分析 4.鏈接過程分析 5.生成文件分析 6.鏡像加載分析 7.鏡像運行分析 u-boot-2021.01 配置出來了 兩個鏡像,spl(output/spl/u-boot-spl.bin)和u-boot(output/u-boot.bin) 所以有兩套過程需要分析 兩套板子 宏觀角度上 共享同一個 配置文件,同一個配置過程,同一個編譯過程,同一鏈接過程 但是可以 從微觀角度 將 配置過程,編譯過程,鏈接過程 分別分為兩個 SPL 1.配置文件分析 ok6410a_mini_defconfig 中的配置中 CONFIG_SPL 開頭的配置 是 SPL
[單片機]
新版U-boot2012.04.01移植(二)(JZ2440-S3C2440)
1、分析u-boot啟動過程 根據u-boot編譯過程分析。 然后打開u-boot.lds文件:
[單片機]
新版U-boot2012.04.01移植(二)(JZ2440-S3C2440)
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 温宿县| 陆河县| 沾益县| 宜州市| 团风县| 朝阳市| 莱西市| 定南县| 凤山市| 嘉禾县| 临江市| 策勒县| 神农架林区| 溧水县| 建水县| 上虞市| 桑植县| 永新县| 吴川市| 姜堰市| 拉萨市| 道孚县| 清镇市| 海门市| 松滋市| 黑龙江省| 平罗县| 宁国市| 广东省| 瑞金市| 舟曲县| 祁连县| 周至县| 南通市| 灵川县| 安国市| 凯里市| 咸宁市| 台江县| 宜章县| 凤山市|