1. 程式人生 > >Zynq 7000從零開始之三 -- mio的gpio操作

Zynq 7000從零開始之三 -- mio的gpio操作

        本文講述怎樣使用PS的gpio,不涉及fpga部分,軟體涉及到一級載入程式fsbl的建立及app的建立,程式執行在ddr中.
        z-turn板的mio 50引腳連線到了按鍵K1,該實驗實現的功能為,檢測按鍵並從串列埠打印出相應的資訊.

        1. 用vivado搭建硬體模型.
        在block design的Re-customize IP介面,點選Presets->Apply Configuration, 定位到上章匯出的memtest.tcl硬體配置檔案.
        點選MIO configuration->展開GPIO,選中GPIO MIO.將硬體引數匯出為gpio.tcl.

        綜合完之後匯出硬體引數,從vivado啟動SDK.

        2. 在SDK中編輯軟體

        2.1 建立一級載入程式fsbl
        File->New->Application,引數如下:
 
        點選Next->選擇Zynq FSBL->Finish.完成後多了兩個工程,fsbl和fsbl_bsp,記得把fsbl_bsp的sd卡驅動改成2.2版本的.

        2.2 建立app工程
        File->New->Application,引數如下:
 
        注意Board Support Package選已建立好的fsbl_bsp,不要建立新的了.點選Next->選擇Hello World->Finish.


        2.3 修改原始碼
        1>. 增加fsbl的列印資訊
            在fsbl的src目錄下,修改fsbl_debug.h檔案,增加#define        FSBL_DEBUG_INFO        1
        2>. 修改helloworld.c檔案
#include <stdio.h>
#include "platform.h"
#include "xgpiops.h"
#include "xil_printf.h"

#define GPIO_DEVICE_ID          XPAR_XGPIOPS_0_DEVICE_ID

#define        K1_PIN                                50

int main()
{
        int Status;
        int cnt = 0;
        XGpioPs_Config *ConfigPtr;
        XGpioPs Gpio;        /* The driver instance for GPIO Device. */

    init_platform();

    print("gpio test\n\r");

        /*
         * Initialize the GPIO driver.
         */
        ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
        Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr,
                                        ConfigPtr->BaseAddr);
        if (Status != XST_SUCCESS) {
                print("cfg init err\n");
                return XST_FAILURE;
        }

        // K1 GPIO Setting
        XGpioPs_SetDirectionPin(&Gpio, K1_PIN, 0);
        XGpioPs_SetOutputEnablePin(&Gpio, K1_PIN, 0);

    while (1) {
            Status = XGpioPs_ReadPin(&Gpio,        K1_PIN);
            if (!Status) {
                    xil_printf("K1 Press %d\n\r", cnt++);
                    while (!XGpioPs_ReadPin(&Gpio,        K1_PIN));
            }
    }

    cleanup_platform();
    return 0;
}


        4. 生成BOOT.bin下載到z-turn板子上執行

        編譯完成後,右擊Project Explorer的fsbl工程->Create Boot Image.
        將gpio.elf新增進來:
 

        CPU上電時,會先執行fsbl,fsbl再將gpio的程式碼copy到ddr中執行,檢視gpio的連結檔案可知gpio程式是在ddr中執行的.

        將gpio\gpio.sdk\fsbl\bootimage\資料夾下的BOOT.bin copy到SD卡上,插到z-turn板上執行,會出現以下串列埠資訊:

Xilinx First Stage Boot Loader 
Release 2014.4  Jan 22 2015-11:39:25
Devcfg driver initialized 
Silicon Version 3.1
Boot mode is SD
SD: rc= 0
SD Init Done 
Flash Base Address: 0xE0100000
Reboot status register: 0x60600000
Multiboot Register: 0x0000C000
Image Start Address: 0x00000000
Partition Header Offset:0x00000C80
Partition Count: 2
Partition Number: 1
Header Dump
Image Word Len: 0x00003003
Data Word Len: 0x00003003
Partition Word Len:0x00003003
Load Addr: 0x00100000
Exec Addr: 0x00100000
Partition Start: 0x000055D0
Partition Attr: 0x00000010
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFDF17C5
Application
Handoff Address: 0x00100000
In FsblHookBeforeHandoff function 
SUCCESSFUL_HANDOFF
FSBL Status = 0x1
gpio test
K1 Press 0
K1 Press 1
K1 Press 2
K1 Press 3
K1 Press 4
K1 Press 5
K1 Press 6

相關推薦

Zynq 7000開始 -- mio的gpio操作

        本文講述怎樣使用PS的gpio,不涉及fpga部分,軟體涉及到一級載入程式fsbl的建立及app的建立,程式執行在ddr中.        z-turn板的mio 50引腳連線到了按鍵K1,該實驗實現的功能為,檢測按鍵並從串列埠打印出相應的資訊.     

開始驅動發開、linux驅動(十二、簡單方式的lcd的背光碟機動)

前面lcd章節我們知道了LCD的背光可以由兩種方式決定調節: 1.一種是I/O口直接輸出高低電平來控制背光的量滅,這種方式簡單,但不能調背光亮度。 2.另一種是採用PWM調節脈衝寬度的方式來控制背光,這種方式需要採用PWM驅動來實現,優點是可以調節螢幕亮度,節省電量。  

開始驅動發開、linux驅動(十一、framebuffer中對mmap使用)

前面framebuffer章節我們瞭解了通過write函式來對fremebbuffer中的視訊記憶體寫資料的方式。   在開始分析mmap之前我們再次回顧一下fb_write函式 static ssize_t fb_write(struct file *file, con

開始驅動發開、linux驅動(十、mmap使用舉例)

上節學習了mmap的對映原理,我們知道mmap對映分為四步: 1.在程序的虛擬地址空間的,建立虛擬對映區域(vm_area_struct) 2.檔案實體地址和程序虛擬地址的一一對映關係(remap_pfn_range 將核心記憶體重新對映到使用者空間) 3.程序發起對這片對映空間的訪

開始驅動發開、linux驅動(十六、linux中common clock framework[1]_consoumer)

部分內容來自下面幾位博主的文章,如有侵權,聯絡我刪除。 時鐘管理模組是linux系統為統一管理各硬體的時鐘而實現管理框架,負責所有模組的時鐘調節和電源管理。時鐘管理模組主要負責處理各硬體模組的工作頻率調節及電源切換管理。一個硬體模組要正常工作,必須先配置好硬體的

開始驅動發開、linux驅動(十九、Linux common clock framework(4)_總結)

前面三節參考蝸窩大神的文章分析了Linux common clock framework的主要實現細節,本篇則是對前三篇從全域性的一個整合說明。   common clock framework主要維護著四條連結串列 static HLIST_HEAD(clk_root_l

開始驅動發開、linux驅動(十八、Linux common clock framework(3)_實現邏輯分析)

1. 前言 前面兩篇clock framework的分析文章,分別從clock consumer和clock provider的角度,介紹了Linux kernel怎麼管理系統的clock資源,以及device driver怎麼使用clock資源。本文將深入到clock framework的

開始驅動發開、linux驅動(十七、linux中common clock framework[2]_provider)

因為裝置樹這裡還沒學習,所以這一節屬於provider章節的完全由蝸窩大神的文章來看。我在暫時只分析一些我知道的,同時對裝置樹這部分的原理和知識也也會盡快學習,補充這篇文章。 http://www.wowotech.net/pm_subsystem/clock_provider.html

Git開始

16px pop 普通 遠程服務 git clone one img 分享 模式 一、遠程倉庫管理   1、將本地內容推送到遠程庫   先關聯遠程庫,執行命令: git remote add origin https://github.com/Hollydan/gitsto

lavarel開始-第彈(路由,控制器,視圖)

clas space web 傳參 route where ace enter ber routes/web.php寫路由 基本路由: Route::get(‘/‘, function () { return view(‘welcome‘);});Route::get

微信公共號(企業號)開發框架-gochat的開始教程(): 智慧機器人模版

感恩節來啦,把自己這個開源框架的挖的坑填一下好了~     之前在第一章的時候就給大家展示過我自己寫的一個智慧聊天機器人,同時具有菜譜查詢、智慧翻譯之類的功能,在這裡我把這個機器人的程式碼開源啦:gochat機器人      這樣大家就可

開始驅動發開、linux驅動(二十九、mmap原理)

一、概念 mmap是一種記憶體對映檔案的方法,即將一個檔案或者其它物件對映到程序的地址空間,實現檔案磁碟地址和程序虛擬地址空間中一段虛擬地址的一一對映關係。實現這樣的對映關係後,程序就可以採用指標的方式讀寫操作這一段記憶體,而系統會自動回寫髒頁面到對應的檔案磁碟上,即完成了對檔案的操作而不必

開始驅動發開、linux驅動(二十八、framebuffer驅動框架)

框架 1.註冊一個framebuffer類。 2.註冊一個主裝置號,因為fb個數通常比較少,所以可以用老的介面統一註冊。 3.為2中的註冊實現通用的fops,注意這裡是通用的,特殊的架構在通用的裡面還是要呼叫專門fb註冊時實現的操作介面。(參考下面) 4.提供統一的註冊,解除安裝

開始資料庫管理-MySQL篇

MySQL有安裝版,還有解壓版。安裝版本根據安裝提示完成安裝即可。注意的是要記住安裝時候填寫的root賬戶密碼。下面介紹解壓版的安裝。 Windows系統安裝,首先去官網下載安裝包準備。https://dev.mysql.com/downloads/mysql/ .msi字尾的為安裝版;根據

開始驅動發開、linux驅動(二十、linux裝置驅動中的併發控制)

本文參考自宋寶華老師的《linux驅動開發詳解》 併發(Concurrency) 指的是多個執行單元同時、 並行被執行, 而併發的執行單元對共享資源(硬體資源和軟體上的全域性變數、 靜態變數等) 的訪問則很容易導致競態(Race Conditions)   只要併發的

開始驅動發開、linux驅動(二十九、linux中的程序)

一、程序 1、什麼是程序 程序的概念是作業系統中最基本、最重要的概念。它是多道程式系統出現後,為了刻畫系統內部出現的動態情況,描述系統內部各道程式的活動規律而引進的一個新概念,所有多道程式設計的作業系統都建立在程序的基礎上。作業系統專門引入程序的概念,從理論角度看,是對正

開始uboot、移植uboot2017.01(一、移植前的準備)

手邊的是一個S5PV210的開發板,想嘗試移植一個比較新的uboot 下載最新版本uboot2018. 編譯器下載 交叉編譯工具鏈的安裝 1.在/usr/local/下面建立一個arm的資料夾,把交叉編譯工具解壓到下面去。 2.為了方便今後使用,

開始驅動發開、linux驅動(四十一、Linux中舊的時鐘管理體系)

老的時鐘管理和新的時鐘管理並無本質的差別。 這裡先列出新的新的common clock framework和老的區別,後面再分析老的實現。 1.老的時鐘框架沒有區分各種時鐘型別,新的框架把時鐘分成了五個不同的時鐘型別,固定頻率的,分頻的,開關型別的,多選一型別。 2.老的時鐘框架需要

開始驅動發開、linux驅動(四十、Linux common clock framework(5)_使用舉例)

前面三節分析的3.16.57核心中,三星的驅動中,恰好S5PV210的CPU沒有使用Linux common clock framework來處理clk。所以,本文采用4.9.92的核心來分析S5PV210對前面第三節中時鐘註冊部分的使用。對於老的時鐘框架,後面章節可能會用1到2部分說明一下。

開始uboot、移植uboot2017.01(七、board_init_r分析)

上一節已經分析到了uboot的board_init_r函式,並且把兩個引數傳遞給它 /* call board_init_r(gd_t *id, ulong dest_addr) */ /* gd的 地址和 當前新的uboot的起始地址傳參給board_init_