【SDK】控制PS侧GPIO

封装函数位于bsp文件下xgpiops.h

void XGpioPs_SetDirection(XGpioPs *InstancePtr, u8 Bank, u32 Direction);// 设置IO的in/out方向
void XGpioPs_SetOutputEnable(XGpioPs *InstancePtr, u8 Bank, u32 OpEnable);// 设置out使能
void XGpioPs_WritePin(XGpioPs *InstancePtr, u32 Pin, u32 Data);//管脚置0/1

选XGpioPs_WritePin()函数分析(\gpiops_v3_1\src\xgpiops.c)

void XGpioPs_WritePin(XGpioPs *InstancePtr, u32 Pin, u32 Data)
{
    u32 RegOffset;
    u32 Value;
    u8 Bank;
    u8 PinNumber;
    u32 DataVar = Data;

    Xil_AssertVoid(InstancePtr != NULL);
    Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
    Xil_AssertVoid(Pin < InstancePtr->MaxPinNum);

    /* Get the Bank number and Pin number within the bank. */
    XGpioPs_GetBankPin((u8)Pin, &Bank, &PinNumber);

    if (PinNumber > 15U) {
        /* There are only 16 data bits in bit maskable register. */
        PinNumber -= (u8)16;
        RegOffset = XGPIOPS_DATA_MSW_OFFSET;
    } else {
        RegOffset = XGPIOPS_DATA_LSW_OFFSET;
    }

    /*
     * Get the 32 bit value to be written to the Mask/Data register where
     * the upper 16 bits is the mask and lower 16 bits is the data.
     */
    DataVar &= (u32)0x01;// 只取最后1bit
    Value = ~((u32)1 << (PinNumber + 16U)) & ((DataVar << PinNumber) | 0xFFFF0000U);// 修改设定的pin位 其他mask掉
    XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr,
              ((u32)(Bank) * XGPIOPS_DATA_MASK_OFFSET) +
              RegOffset, Value);// 最终写入 MASK_DATA_0_LSW 寄存器
}

选XGpioPs_WriteReg()分析(xgpiops_hw.h)

#define XGpioPs_WriteReg(BaseAddr, RegOffset, Data)    \
        Xil_Out32((BaseAddr) + (u32)(RegOffset), (u32)(Data))// 带参宏把功能映射到底层函数上

分析Xil_Out32() (\standalone_v5_5\src\xil_io.c)

void Xil_Out32(UINTPTR Addr, u32 Value)
{
    volatile u32 *LocalAddr = (u32 *)Addr;// 强制类型转换 映射到地址
    *LocalAddr = Value;// 把数据写到该地址
}

---

时间: 2024-10-25 08:34:53

【SDK】控制PS侧GPIO的相关文章

zynq PS侧DMA驱动

linux中,驱动必然会有驱动对应的设备类型.在linux4.4版本中,其设备是以设备树的形式展现的. PS端设备树的devicetree表示如下 324 dmac_s: [email protected] { 325 compatible = "arm,pl330", "arm,primecell"; 326 reg = <0xf8003000 0x1000>; 327 interrupt-parent = <&intc>; 328

多个SDK控制管理

需求:制作一个公共组件,可以实现多个SDK想用哪个用哪个,集中管理 组织方式: 架构形式 实现步骤: 1.Centralization是中央类,所有的sdk都要通过这个类来调 2.新增sdk的话,新建一个文件夹,在里面写代码 3.如果有绑定生命周期,实现IGameCenter接口,且在Centralization里添加 例: @Override public void onResume() { Log.d(TAG, "CentralizationImpl--onResume"); ga

ESP8266 SDK开发: 外设篇-GPIO中断检测

直接上代码 #include "gpio.h" //设置GPIO0下降沿中断 PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U , FUNC_GPIO0);//GPIO0做为普通IO使用 GPIO_DIS_OUTPUT(0);//0:GPIO0 如果以前设置过GPIO为输出,则调用此函数关闭GPIO0输出 PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO0_U);//GPIO0上拉输入 _xt_isr_mask(1<<ETS_G

用Siri来控制树莓派的gpio达到控制台灯的效果

先上视频.

嵌入式开发之zynq---Zynq PS侧sd驱动

http://blog.chinaunix.net/uid-29404121-id-4217026.html http://blog.chinaunix.net/uid-29709984-id-4304978.html http://blog.chinaunix.net/uid-26707720-id-3979376.html http://blog.chinaunix.net/uid-21973366-id-3970069.html http://blog.csdn.net/simonjay2

嵌入式开发之zynq---Zynq PS侧I2C驱动架构

http://blog.chinaunix.net/uid-24148050-id-120532.html http://bbs.csdn.net/topics/390538368?page=1 http://blog.csdn.net/lanyou1900/article/details/41724103 http://blog.csdn.net/lqxandroid2012/article/details/51367376 http://blog.chinaunix.net/uid-2340

android4.3 SDK控制动态显示导航栏(NavigationBar)

//-------------------------------------------------------------------------------------------- // 作者:longtian635241 // 发布日期:2015-08-25 // 最后修改:2015-08-25 //http://blog.csdn.net/longtian635241 //--------------------------------------------------------

OpenWRT GPIO口控制 WLED

Linux系统下GPIO系统架构介绍 关于这个GPIO很久以前一直以为很简单,但是,当你需要给一个特定的系统,搞这些GPIO的时候,你会发现,事实并不是如此,比如,mt7620n. GPIO#72是控制WLED -> WLAN LED. GPIO#40~44是控制WAN, LANLED. GPIO#1是控制Reset 这些东西以为自己写一个GPIO driver就完成了,其实没有那么简单,光是这个小驱动你怎么编译都比较麻烦,所以还是乖乖的学习OpenWRT的系统架构吧. 这里要说道重点dts.这

树莓派GPIO控制

陈拓[email protected] 2018.06.09/2018.06.10 0.  概述 本文介绍树莓派 Zero W的GPIO控制,并用LED看效果. 0.1 树莓派GPIO编号方式 功能物理引脚 从左到右,从上到下:左边基数,右边偶数:1-40 BCM 编号侧重CPU寄存器,根据BCM2835的GPIO寄存器编号. wiringPi 编号侧重实现逻辑,把扩展GPIO端口从0开始编号,这种编号方便编程.如图 WiringPi一栏. 操作GPIO时一定先要清楚使用那一套编号. 1.  准