---
# System prepended metadata

title: Ultral96-V2 and standalone

---

# Ultral96-V2 and standalone

## petalinux操作流程
### 流程
* vivado
    1. 在create project時，選擇avent並找到ultra96-v2的版本下在BSP
    2. 建立一個初步的PS，並把uart打開
    3. generate bitstream
* petalinux
    1. 記得要把boot uart改成uart1，參考[這篇](https://qiita.com/daiki0321/items/fee01d227271cbecdea3)
    2. spi要使用要在`petalinux-config -c kernel`當中，把> Device Drivers > SPI support > "`User mode SPI device driver support `" 功能打開
    3. 


## standalone操作流程
### 大方向
* vivado
    1. vivado 先去網路上更新bsp，才能找到avnet板子的bsp
        > ~~參考[本篇](https://coldnew.github.io/b1903c9f/)可於[Avnet github](https://github.com/Avnet/bdf)找到ultra96-v2的板子資訊~~ 
        > 
        > 只需參考下圖，在vendor的欄位輸入或選擇avent.com，並下載需要的board file即可
        > ![image](https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-blogs-components-weblogfiles/00-00-00-03-95/8206.JPG)
    3. 以Ultral96-V2建立block diagram
    4. systhises,implentment,（沒有pl external就不用設定io）
    5. bitstream,建立xsa
* vitis
    1. 根據xsa建立platform project
    2. 整體流程可參考 hackster.io [這篇](https://www.hackster.io/BryanF/ultra96-v2-vitis-2020-2-hello-world-from-arm-a53-2d952a)，比較需要注意的是設定standalone BSP時stdin,stdout要設定uart1 
![image alt](https://hackster.imgix.net/uploads/attachments/1289330/image_7j3L4DO7gN.png =90%x)
![image alt](https://hackster.imgix.net/uploads/attachments/1289331/image_J8cfhdWAuY.png =90%x)
    3. 設定好之後對platform project,build project
    4. 確認都沒問題之後，建立appilcation project
    5. 選擇剛剛建立好的platform project作為基底，並且選你要使用的core
    6. 選擇hello world project產生模板，並且直接build project
    7. 檢查switch是否使用jtag模式，檢查uart連接的pin腳，並且上電開機
    ![image alt](https://hackster.imgix.net/uploads/attachments/1290275/image_RXwHPazifE.png =90%x)
    8. 使用run as將hello world燒錄在板子上，並可使用putty或是vitis本身的console去看是否有印出hello world
    9. 若發現jtag無法連線成功，權限被拒絕，記得使用sudo 並找出vitis的路徑執行，方可正確運行
## Ultral96-V2


# MISC
https://www.kernel.org/doc/Documentation/devicetree/bindings/arm/
https://e-mailky.github.io/2019-01-14-dts-1

## 目前的問題
### 20230921
* 想做：修改xilinx yocto本身提供的spi把修改傳輸開始與結束的等待時間
* 問題： 
    * 不清楚現在spi到底是用哪一個driver?
    * 理論上來說我應該要可以找到相同於信號長相的傳輸程式，但我一直沒找到
    * 不清楚xilinx driver開發流程的全貌，包含：device tree

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842262/Zynq+QSPI+Driver

https://www.cntofu.com/book/46/linux_system/156.md
    ![image alt](https://xilinx-wiki.atlassian.net/wiki/download/attachments/18842255/spimenuconfig.PNG?version=1&modificationDate=1536676100905&cacheVersion=1&api=v2)

https://support.xilinx.com/s/question/0D52E00006hpl8XSAQ/how-to-properly-build-device-tree-for-spi?language=en_US

user mode spi device driver support
![image alt](https://www.beyond-circuits.com/wordpress/wp-content/uploads/2016/08/tutorial26_config_kernel.png)

https://support.xilinx.com/s/article/1197597?language=zh_CN

## Device tree petalinux

https://docs.xilinx.com/r/en-US/ug1144-petalinux-tools-reference-guide/Device-Tree-Configuration

以下是一個AMBA bus with GPIO register mapping在0x4120000，並使用中斷91
91 -32 = 59,32是第一個share peripheral interrupt
device compatible 'xlnx,simple'
```
ps7_axi_interconnect_0: amba@0 {
    #address-cell = <1>;
    #size-cell = <1>;
    compatible = "xlnx,ps7-axi-interconnect-1.00.a","simple-bus";ranges;
    axi_gpio_0:gpio@41200000{
        #gpio-cell = <2>;
        compatible = "xlnx,simple";
        interrupt-parent = <&ps7_scugic_0>;
        interrupt = <0 59 4>
        reg = <0x41200000 0x1000>;
        xlnx,is-dual = <0x1>;
    }
}


```
https://github.com/Xilinx/linux-xlnx/blob/master/drivers/spi/spi-cadence.c

https://github.com/DIP5009/Xilinx-FPGA-Tutorial#42-standalone-driver

https://www.youtube.com/watch?v=rTI01fjrCjU

https://www.qiniu.com/qfans/qnso-50504516#comments
spitestapp -D /dev/spidev1.0 -s 115200
https://e-mailky.github.io/2016-12-06-dts-introduce


## boot
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/444006775/Zynq+UltraScale+MPSoC#ZynqUltraScale%2BMPSoC-EmbeddedDesignTutorial(EDT)
![image alt](https://xilinx-wiki.atlassian.net/wiki/download/thumbnails/444006775/ZU%2B%20SW%20Stack.PNG?version=1&modificationDate=1586552889748&cacheVersion=1&api=v2&width=204&height=400 =30%x)
* Overview of the Embedded Software Stack on a Zynq UltraScale+ MPSoC
    * the BootROM (part of the CSU ROM code) interprets the boot header to configure the system and load the processing system’s (PS) first-stage boot loader (FSBL) code into the on-chip RAM (OCM) in both secure and non-secure boot modes.The boot header parameters can be found int the Zynq UltraScale+ Device TRM UG1085

一般需要兩個分區，一個是放置boot啟動的鏡像資料(boot.bin,linux)，另一個是ext4

## 書裡寫的
參考書裡寫的內容
### modprobe
跟insmod有所不同
* 引數不是檔名，是'module'名
* 會自動到/lib/modules/'uname -r' 搜尋檔案
* 會參考lib/modules/'uname -r' /modules.dep，如果有相關的其他modules會一起載入
### 開機時載入驅動程式
```
/etc/rc.local
/etc/rc.sysinit
/etc/rc.d/rc?.d
```
### 加到kernel配置選單
舉例來說要寫一個character device driver
先到/drivers/char把建立一個子目錄
```shell
cd /drivers/char
mkdir hello && cd hello
ls 
makefile main.c sub.c
```
上面的makefile
```make
obj-$(CONFIG_HELLO) += hello.o
hello-objs := main.o sub.o
```
char 本身makefile && Kconfig
```make
# Makefile for the kernel char device drivers
FONTMAPFILE = cp437.uni

obj-y += men.o random.o tty_io.o n_tty.o tty_ioctl.o

obj-$(CONFIG_HELLO) += hello/

obj-$(CONFIG_LEGACY_PTYS) += pty.o

```

```make
menu "Character devices"

config HELLO 
        tristate "hello driver"
        ---help---
            This is a sample driver.

config VT
        boot "virtual terminal" if EMBEDDED
        ...

```
好了之後
```shell
make menuconfig
```






## 启用Linux内核驱动dev_dbg调试信息
https://www.qiniu.com/qfans/qnso-

有没有一种最简单的方法来启用Linux内核驱动的dev_dbg调试信息（实际上是一种trace风格的信息），希望能在不破坏内核补丁/重新编译或驱动实现一些额外的东西如debugfs的情况下？也许有办法在内核中启用一些简单的东西（比如一个标志）来触发特定的驱动或所有的驱动dev_dbg（可以用`dmesg|grep "driverName"）输出？

You need to follow below three steps.

1. 确保你的内核符合CONFIG_DYNAMIC_DEBUG=y的规定。  
    ```cat /proc/config.gz | gunzip | grep CONFIG_DYNAMIC_DEBUG```  
如果没有，就用CONFIG_DYNAMIC_DEBUG=y重新编译你的内核。

2. 开机后检查debugfs是否被挂载在某处。
```mount | grep debugfs```  
大多数情况下，它被挂载在/sys/kernel/debug，如果不是，你可以手动挂载在任何地方，如下所示  
```mount -t debugfs none /sys/kernel/debug```
3. 现在启用你需要dev_dbg()日志的文件名。  
```echo 'file <driverfilename.c> +p'>/sys/kernel/debug/dynamic_debug/control```  
更多关于dynamic_debug/control的指令请见
https://www.kernel.org/doc/html/v4.11/admin-guide/dynamic-debug-howto.html

now you should get your debug.

如果你仍然没有看到你的信息，那么请启用prink级别。

```echo "8    4    1    7" > /proc/sys/kernel/printk```  
如果没有设置CONFIG_DYNAMIC_DEBUG选项，那么dev_dbg/pr_debug可以变成正常的printk()语句，具有KERN_DEBUG级别。

但为此你需要在文件的开头加上```#define DEBUG```。 或在编译时加入```-DDEBUG``` 或启用``` CONFIG_[SUBSYSTEM]_DEBUG=y```