xilinx官网相同的dts可以用于不同的内核吗

【图文】Xilinx All Programmable SoC
Zynq-7000 总结(2)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Xilinx All Programmable SoC
Zynq-7000 总结(2)
&&Xilinx于2011年3月成功推出全球首款集成ARM双核Cotex A9处理器的All Programmable SoC产品,再一次激起FPGA双雄Xlinx和Altera之间的竞争,并有愈演愈烈之势。Xlinx随产品推出了开源的16层zc702开发板和zc705母板,Altera紧随老大其后,也推出了性能和成本不同搭配的Cyclone V 和Arria V 两款SoC Hard Processor System,近期也有开发套件Cyclone V SX SoC和DS-5跟进。看来这一波竞争才刚刚上演。
附件是第二部分总结。
大小:2.83MB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢【Xilinx-Petalinux学习】-02-建立PetaLinux工程 - vacajk - 博客园
前面我已经把PetaLinux成功安装到了Ubuntu虚拟机当中了,接下来就要实际操作,将PetaLinux移植到我们自己的硬件平台当中去。
step1:硬件描述文件
有两种PetaLinux工程建立的方法,一种是下载官方开发板的BSP包并安装,一种就是针对自己的硬件平台去剪裁Linux功能以适应自己的需求。
第一种,比较简单,官方提供了完整的demo和已经预编译好的各种文件。
比如说我们从网上下载了Avnet-Digilent-ZedBoard-v2015.4-final.bsp,我们直接执行下面的命令就可以安装这个BSP包了。安装完成后,PetaLinux工程就安装在了Avnet-Digilent-ZedBoard-v2015.4-final文件夹下面。可以选择自己重新编译,或者直接使用预编译好的文件直接拷贝到SD卡中,马上就能够在ZedBoard上运行PetaLinux了。
petalinux-create -t project -s ./Avnet-Digilent-ZedBoard-v2015.4-final.bsp
第二种,根据我们自行设计的硬件平台去创建PetaLinux工程。这就稍微复杂一些了,需要进行各种配置,我也是尝试了各种配置方法,最终获得了一个基本上满足我需求的结果。
选用的芯片是ZYNQ系列的芯片,我们将会在内部的ARM硬核上去跑Linux。
首先,为了让PetaLinux正常的运行,需要分配一些硬件外设资源给PetaLinux,文档ug1144中也说明了PetaLinux中对Zynq-7000系列FPGA硬件资源的需求。若用到了MicroBlaze或者Zynq Ultrascal+ MPSoC的话,自己查看文档说明吧。
1.TTC模块(必须) #如果多个TTC都使用了的话,Linux内核将会使用第一个TTC模块。
2.外部32MB存储空间(必须)
3.UART模块(可选,控制台打印信息用) #如果用UART IP模块的话,如AXI UART,需要确保中断信号有连接到PS
4.非易失存储器(可选) #如QSPI Flash,SD/MMC
5.以太网接口(可选) #若果用Ethernet IP模块或外部PHY的话,需要确保中断信号连接道PS
知道这些后,我们在Vivado中设计硬件平台时需要预留好上述模块就可以了。Vivado设计,综合,实现后,我们在Vivado中使用&Export Hardware&输出PetaLinux需要的硬件描述文件。
输出的文件都在&/&vivado project&/&project name&.sdk/&top module name&_hw_platform_0&文件夹下。
如果我们使用的是Windows版本的Vivado,我们就需要把&***_hw_platform_0&这个文件夹拖到Linux虚拟机当中去。如果使用Linux版本的Vivado,之后直接定位到这个文件夹就可以了。
step2:创建PetaLinux工程
接下来就能够根据这些硬件描述文件,来创建基于我们自己的硬件平台的PetaLinux工程了。
首先,创建一个PetaLinux工程目录。执行命令:
#创建工程,针对Zynq芯片,工程名称ifc_petalinux
petalinux-create --type project --template zynq --name ifc_petalinux
创建成功后,在ifc_petalinux目录下将包含2个文件夹和一个文件,如下所示。
接着,我们来引用刚才输出的硬件描述文件。执行命令:
petalinux-config --get-hw-description=/home/xilinx-arm/PetaLinux/ifc_v1_0/ifc_hw_description/IFC_TOP_wrapper_hw_platform_0
因为是空工程,我们会进入一个配置界面。在里面我们可以配置一些系统参数,主要的配置包括:启动方式,启动存储器分区表,启动文件名称等等。
这里我们仅需要修改两个启动方式选项即可。boot和kernel的存储位置,都选到QSPI Flash即可。配置如下:
#Subsystem AUTO Hardware Settings ---&
# Advanced bootable images storage Settings ---&
boot image settings ---&
image storage media ---& choose primary flash
kernel image settings ---&
image storage media ---& choose primary flash
这里要说明一下,因为我自己的板子上包含了QSPI Flash、eMMC、USB,而没有SD卡、以太网。
所以非常尴尬,不能通过简单的SD卡复制文件去进行系统boot,必须通过JTAG下载BOOT.bin和image.ub文件。非常非常的e'xin!!下载两个文件就要下载好久,这也导致我每次尝试都花费大量时间在下载Flash上。
所以在这里,建议大家一定要在设计板子的时候尽量留好SD卡的位置,或者就算留上几个测试点飞线出来也好,对开发来说肯定会提供很多方便。
回到正题,配置完成后,按ESC并选择YES保存配置。系统就自动进行配置了,配置成功的打印信息如下:
为了方便我们之后复制和修改文件,执行命令:
chmod -R 777 ../ifc_petalinux/
step3:内核配置
因为硬件平台没有SD卡和网口,尴尬的我很难复制文件。想了个办法,就是通过U盘去复制文件,所以我需要把USB配置一下,让系统能够识别出U盘,并进行读写操作。而且以后可能用到USB摄像头,就顺便把这个功能也打开吧。参考网址:http://www./Zynq+Linux+USB+Device+Driver
配置kernel,执行命令:
petalinux-config -c kernel
打开了kernel的配置界面,
USB的配置如下:
#Device Drivers ---&
USB support ---&
&*& Support for Host-side USB
&*& OTG support
&*& EHCI HCD (USB 2.0) support
&*& USB Mass Storage support
&*& ChipIdea Highspeed Dual Role Controller
&*& ChipIdea host controller
&*& ChipIdea device controller
USB Physical Layer drivers ---&
&*& NOP USB Transceiver Driver
####!!!在2015.4中不用打开这个
&*& USB Gadget Support
&M& USB Gadget Drivers
&M& USB functions configurable through configfs
[*] Mass storage
上面都是按照OTG功能来配置的,但我暂时没有OTG的转接线,没法调试不敢确认是否能用,所以我们最后在设备树中只开启host功能。
其实除了&NOP USB Transceiver Driver&是默认没有打开,剩下都是默认打开的,我最终根据自己的配置并没有打开这个选项!!!
USB摄像头配置如下:
#Device Drivers ---&
Multimedia Support ---&
Media USB Adapter ---&
&*&USB Video Class (UVC) (also UVC Input Event Support) #打开
USB Support ---&
& &USB 2.0 OTG FSM Implementation #关闭
配置完成后,ESC并保存。
step4:设备树配置
我设计的板子是参考ZYBO开发板的,usb phy上有一个reset引脚连接到了PS的MIO46管脚上。
需要在设备树中告诉系统。
设备树文件都在目录 ./subsystems/linux/configs/device-tree 底下
首先修改pcw.dtsi文件:(在最下面的问题二中,解决了usb reset的问题。按照解决方法配置好后,就不用修改pcw.dtsi文件了,它能够自动生成!)
gedit subsystems/linux/configs/device-tree/pcw.dtsi
#在&usb0上增加一行usb-reset = &&gpio0 46 0&;
#最后如下:
dr_mode = "host";
phy_type = "ulpi";
status = "okay";
usb-reset = &&gpio0 46 0&;
接着修改system-top.dts文件:
gedit subsystems/linux/configs/device-tree/system-top.dts
#可以看到里面基本是空的
#在里面增加以下内容
flash0: flash@0 {
compatible = "micron,n25q128a11";
usb_phy0: usb_phy@0 {
compatible="ulpi-phy";
###假如前面的kernel配置中打开了&NOP USB Transceiver Driver&,需要配置为compatible="usb-nop-xceiv";
#phy-cells = &0&;
reg = &0xex1000&;
view-port=&0x170&;
reset-gpios = &&gpio0 46 1&;
status = "okay";
dr_mode = "host";
usb-phy = &&usb_phy0&;
其中QSPI Flash我用到型号是N25Q128A11EF740E,所以要在这个设备树中说明。而USB配置为host模式,并打开VBUS电源。
step5:编译和下载程序
终于,配置完成了,接下来就可以愉快的编译了,执行命令:
petalinux-build
编译成功log:
最终在./images/linux文件夹下,就能够找到我们需要的各种文件了。
我们需要的四个文件是:
zynq_fsbl.elf
#FSBL可执行文件
IFC_TOP_wrapper.bit
#FPGA配置bit文件
u-boot.elf
#SSBL可执行文件
#linux镜像文件
由于我没有在Linux虚拟机中安装Vivado,所以我没有办法使用&petalinux-package&命令。
因此我将这四个文件拖到Windows中进行处理,
在Windows中打开Xilinx SDK,选择 Xilinx Tools-&Create Boot Image,可以参考一下官方手册,
分别按顺序加入 zynq_fsbl.elf---&IFC_TOP_wrapper.bit---&u-boot.elf 三个文件。点击 Create Image 按钮,生成BOOT.bin文件。
因为我的系统中没有SD卡,而且一开始就配置为了QSPI FLASH启动的方式,在Xilinx SDK中选择 Xilinx Tools-&Program Flash。
Image File选择刚才生成的BOOT.bin文件,Flash Type选择qspi_single,Offset填写0,点击Program按钮。烧录完成后,我们的FSBL,bit,SSBL就成功下载到QSPI Flash中去了,我们就已经可以实现u-boot的启动了,但是还不能引导kernel。
接下来烧录image.ub文件,因为Image File只能选择.bin或者.mcs文件,所以需要把image.ub重新命名为image.ub.bin,好像有点粗暴。。。
然后Offset需要填写偏移地址,这个地址可以通过petalinux-config配置,或者可以通过system-config.dtsi文件查看。内容如下:
#address-cells = &1&;
#size-cells = &0&;
flash0: flash@0 {
compatible = "micron,n25q128";
reg = &0x0&;
#address-cells = &1&;
#size-cells = &1&;
spi-max-frequency = &&;
partition@0x {
label = "boot";
reg = &0xx&;
partition@0x {
label = "bootenv";
reg = &0xx&;
partition@0x {
label = "kernel";
reg = &0xx00a80000&;
partition@0x00fa0000 {
label = "spare";
reg = &0x00fa00000&;
可以看到kernel的偏移地址是0x,所以Offset就填写这个数值。点击Program烧录。
最终,我们通过跳线方式将板子的启动方式配置为QSPI Flash,上电,启动~~~~
我们的PetaLinux就成功运行了~~~~哈哈哈哈
运行后插入了USB Hub和U盘,成功挂载!之后传输文件或者更新BOOT.bin和image.ub就可以用U盘复制了,JTAG下载flash的方式实在是太慢了!
Log打印没有截图,有空了copy一下。先留个位置。
需要做PetaLinux版本控制时,需要备份如下几个文件夹内的所有文件:
& "&plnx-proj-root&/.petalinux"
& "&plnx-proj-root&/build/"
& "&plnx-proj-root&/images/"
需要注意的问题:
1.假如在FPGA中用到了VDMA模块,在编译时会提示有错误出现。
原因是VDMA的中断编号有错误,我的处理方法是在pl.dtsi设备树文件中,把每个VDMA模块里的MM2S,S2MM通道的interrupt=-1那两行直接删除,这样就能够成功编译了。但是有什么影响我就不知道了。以后再研究吧。
2.在petalinux-config配置完成后,提示类似No USB reset found, No ethernet reset found类似的警告。
一直以为是设备树的问题,最后发现原来是在Vivado中Zynq系统配置时,没有设置Reset对应的MIO管脚。配置好后就不需要修改pcw.dtsi文件了。如下图,配置了USB的Reset为MIO46。
配置这个后,当调用 petalinux-config --get-hw-description=/*** 命令时,就会自动在pcw.dtsi文件中生成&usb-reset = &&gpio0 46 0&;&这段描述了。
3.USB HOST模式,USB PHY的CPEN不使能电源,导致不能向外供电。
由于我使用的是2015.4的PetaLinux,这个bug已经被修复了。在之前的版本会出现这个现象,大致原因就是就算配置设备树成host模式,系统仍然按otg方式配置了USB。
问题描述的网址:
/t5/Embedded-Linux/Petalinux--usb-not-working/td-p/654349
http://zedboard.org/content/using-petalinux-configure-zedboard%EF%BC%8C-usb-otg-can-not-work解决方法就是在petalinux中安装一个app,每次启动时候运行脚本强制打开USB。也可以手动打开,针对usb0,执行命令:devmem 0xe 0x600a0067
补丁网址:/xlnx/attachments/xlnx/ELINUX/14090/1/force_usb_power.tar.gz
app的安装方法参考ug1144,执行的命令大致包括:
mkdir ./components/apps/force_usb_power
#复制force_usb_power.sh, Kconfig, Makefile, README四个文件到文件夹下
petalinux-config -c rootfs
#进入Applications ---& 使能force_usb_power应用
petalinux-build -c /rootfs/force_usb_power
petalinux-build -c /rootfs/force_usb_power
petalinux-build -x package
#得到了打了补丁的image.ub文件温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
这里一共注册了118个GPIO口,看看Datasheet就知道这里的意思应该是MIO[0:53]+EMIO[54:117],也就是54个MIO加上64个EMIO,看到这里我还是有一些疑问,因为并不是所有的IO口都作为GPIO来使用的,有很大一部分是进行IO复用的,下面是我在XPS中的MIO配置截图:&可以看到MIO中真正作为GPIO口使用的也就只有MIO[0,7,9:15,50:51],我当时就有疑问:如果我在Linux中申请了这一部分被复用的GPIO,这会不会与正在复用的那些功能起冲突?(至少在MCU中有很多复用功能是在配置了GPIO方向之后才能正常复用的)后来看来一下zynq的UG585手册,找到了下面这张图才解决了问题:可以看到所有GPIO与其他复用的功能最后都是经过MIO网络路由到外部的GPIO端口的,也就是说即使在相应的GPIO寄存器中配置了GPIO的功能,那么这部分功能也不会生效!而配置这些复用功能的寄存器是在slcr(System Level Control Registers)寄存器中操作的,可以在UG585上找到这些寄存器具体的参数:而在Digilent Linux内核中,slcr相关的文件可以在linux-digilent/arch/arm/mach-zynq/slcr.c中找到。另外除了MIO,还有EMIO的配置,可以在上面的截图中看到XPS中配置了60个EMIO,并且在xps的ucf文件中可以找到配置相关注释:############################################################## & & & & & & & & & & & & & & & & & & & & & & & & & & & & & ## GPIO Interface & & & & & & & & & & & & & & & & & & & & & &## & & & & & & & & & & & & & & & & & & & & & & & & & & & & & ##############################################################………………………………############################# & & & & & & & & & & & & &## On-board OLED & & & & & &## & & & & & & & & & & & & &## Voltage control and & & &## Bitbanged SPI over GPIO &## & & & & & & & & & & & & &#############################net processing_system7_0_GPIO&1& LOC = U11 &| IOSTANDARD = LVCMOS33; # OLED-VBATnet processing_system7_0_GPIO&2& LOC = U12 &| IOSTANDARD = LVCMOS33; # OLED-VDDnet processing_system7_0_GPIO&3& LOC = U9 & | IOSTANDARD = LVCMOS33; # OLED-RESnet processing_system7_0_GPIO&4& LOC = U10 &| IOSTANDARD = LVCMOS33; # OLED-DCnet processing_system7_0_GPIO&5& LOC = AB12 | IOSTANDARD = LVCMOS33; # OLED-SCLKnet processing_system7_0_GPIO&6& LOC = AA12 | IOSTANDARD = LVCMOS33; # OLED-SDIN############################# & & & & & & & & & & & & &## On-board LED's & & & & & ## & & & & & & & & & & & & &#############################net processing_system7_0_GPIO&7& &LOC = T22 | IOSTANDARD = LVCMOS33; # LD0net processing_system7_0_GPIO&8& &LOC = T21 | IOSTANDARD = LVCMOS33; # LD1net processing_system7_0_GPIO&9& &LOC = U22 | IOSTANDARD = LVCMOS33; # LD2net processing_system7_0_GPIO&10& LOC = U21 | IOSTANDARD = LVCMOS33; # LD3net processing_system7_0_GPIO&11& LOC = V22 | IOSTANDARD = LVCMOS33; # LD4net processing_system7_0_GPIO&12& LOC = W22 | IOSTANDARD = LVCMOS33; # LD5net processing_system7_0_GPIO&13& LOC = U19 | IOSTANDARD = LVCMOS33; # LD6net processing_system7_0_GPIO&14& LOC = U14 | IOSTANDARD = LVCMOS33; # LD7############################# & & & & & & & & & & & & &## On-board Slide Switches &## & & & & & & & & & & & & &#############################net processing_system7_0_GPIO&15& LOC = F22 | IOSTANDARD = LVCMOS33; # SW0net processing_system7_0_GPIO&16& LOC = G22 | IOSTANDARD = LVCMOS33; # SW1net processing_system7_0_GPIO&17& LOC = H22 | IOSTANDARD = LVCMOS33; # SW2net processing_system7_0_GPIO&18& LOC = F21 | IOSTANDARD = LVCMOS33; # SW3net processing_system7_0_GPIO&19& LOC = H19 | IOSTANDARD = LVCMOS33; # SW4net processing_system7_0_GPIO&20& LOC = H18 | IOSTANDARD = LVCMOS33; # SW5net processing_system7_0_GPIO&21& LOC = H17 | IOSTANDARD = LVCMOS33; # SW6net processing_system7_0_GPIO&22& LOC = M15 | IOSTANDARD = LVCMOS33; # SW7这里的processing_system7_0_GPIO指的的就是EMIO,所以可以看到EMIO[1:6]是用的OLED,而在GPIO寄存器配置中:GPIO Bank0, MIO[0:31]GPIO Bank1, MIO[32:53]GPIO Bank2, EMIO[0:31]GPIO Bank3, EMIO[32:63]是顺序排列的,所以上面这里的EMIO[1:6]对应的就是GPIO[55:60],然后我们可以在devicetree源文件中找到oled的配置:
zed_oled {
compatible = "dglnt,pmodoled-gpio";
/* GPIO Pins */
vbat-gpio = &&gpiops 55 0&;
vdd-gpio = &&gpiops 56 0&;
res-gpio = &&gpiops 57 0&;
dc-gpio = &&gpiops 58 0&;
/* SPI-GPIOs */
spi-bus-num = &2&;
spi-speed-hz = &4000000&;
spi-sclk-gpio = &&gpiops 59 0&;
spi-sdin-gpio = &&gpiops 60 0&;
};这里面的GPIO的号码正好对应了刚才计算出来的数字,到这里也就能理解这些号码的意义了:-)(这里需要事先设置好GPIO控制器,可以在前面找到gpio-controller字段)。但是看到这里不禁又有了另一个疑问,为什么设备树只有oled的配置,而没有led和switch的配置,这也是当初我找不到内核在哪里操作led的原因。有一次无意间在ZedBoard_Linux_Design的doc目录下的DemoFeatures.txt中发现内核中自带了这样两个命令:&SWITCHES/LEDS: Scripts are included for writing to the LEDs and reading&the state of the switches. To read the state of the switches, run the&&command:&& &read_sw&&It will return the state of the switches as both hexadecimal and decimal.&A script for changing the state of the LEDs is also included. To turn all&8 LEDs on, run one of the following two commands:&& &write_led 255& &write_led 0xFF然后再仔细一看ramdisk中read_sw,write_led里面的内容:thinki@G31T-M2:$ cat write_led&#!/bin/shvalue=$(($1));if [ $value -ge 0 ]; then& & & & for i in 0 1 2 3 4 5 6 7;& & & & do& & & & & & & & led=$(($i+61));& & & & & & & & echo $(($value&0x01)) & /sys/class/gpio/gpio$led/& & & & & & & & value=$(($value/2));& & & &thinki@G31T-M2:$ cat read_sw&#!/bin/shvalue=0;for i in 0 1 2 3 4 5 6 7;do& & & & sw=$((76-$i));& & & & sw_tmp=`cat /sys/class/gpio/gpio$sw/value`;& & & & value=$(($value*2));& & & & value=$(($value+$sw_tmp));printf "0x%x %d\n" $value $可以看到这里直接操作了sysfs下面的gpio class进行LED的写和Switch的读,但是这些目录以及相关的文件并不是凭空而来的,最后在ramdisk的etc/init.d/rcS中可以找到这样一段脚本:echo "++ Exporting LEDs & SWs"for i in 0 1 2 3 4 5 6 7;&do& & & & sw=$(($i+69));& & & & led=$(($i+61));& & & & echo $sw & /sys/class/gpio/& & & & echo $led & /sys/class/gpio/& & & & echo out & /sys/class/gpio/gpio$led/这才是这些目录真正的开端,启动时配置了这些,你只要Google一下sysfs gpio就可以找到一大堆东西,这里我简要介绍一下,也就是linux下gpio支持sysfs空间的操作,也就是可以绕过创建设备节点进行此操作,不过首先需要开启内核对sysfs的支持以及gpiolib对sysfs的支持,相关的代码依旧在drivers/gpio/gpiolib.c文件中,我们可以找到相关的宏:#ifdef CONFIG_GPIO_SYSFS这个宏下面的内容都是针对SYSFS相关的支持,这里涉及的知识比较多,需要理解Linux 2.6的设备模型相关的知识。如果是直观的操作的话,你只需要在/sys/class/gpio下进行echo XXX & export操作,不过这里XXX必须是内核支持的gpio号,比如内核启动之后在rcS脚本中echo的就是[61:68]和[69:76],这样就会在/sys/class/gpio目录下创建gpioXXX目录,然后我们可以设置led对应的gpioXXX目录下的direction属性为out就能够设置GPIO为输出,最后只需要像write_led脚本中那样向/sys/class/gpio/gpioXXX/value echo 0或者1就可以了,最终你会看到LED灯点亮!当然你也可以使用类似于pmodoled驱动的形式,最终以/dev目录下的设备节点来操作底层硬件,这样的话就需要注册platform驱动并且通过设备树中的节点进行匹配,可以在设备树源文件最后添加下面的配置信息:
emio-oled {
compatible = "dglnt,emioled-gpio";
/* GPIO Pins */
ld0-gpio = &&gpiops 61 0&;
ld1-gpio = &&gpiops 62 0&;
ld2-gpio = &&gpiops 63 0&;
ld3-gpio = &&gpiops 64 0&;
ld4-gpio = &&gpiops 65 0&;
ld5-gpio = &&gpiops 66 0&;
ld6-gpio = &&gpiops 67 0&;
ld7-gpio = &&gpiops 68 0&;
};有时间我把我写的代码贴出来晒晒!在platform驱动中的probe函数中来进行cdev的初始化与file_operations的设置,具体可以参考pmodoled驱动中的代码。同时gpiolib还支持debugfs,可以查看哪些GPIO口被哪些设备分配了,不过使用之前需要先挂载debugfs,它与sysfs一样也是基于内存的文件系统:mount -t debugfs debugfs /sys/kernel/debug &然后在板子上输出gpio文件的信息:zynq& mount -t debugfs debugfs /sys/kernel/debug & & & & & & & & & & & & & & & & & & & & & & &&zynq& cat /sys/kernel/debug/gpio & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &&GPIOs 0-117, platform/e000a000.gpio, xgpiops: & & & & & & & & & & & & & & & & & & & & & & & & &zynq& mount -t debugfs debugfs /sys/kernel/debug & & & & & & & & & & & & & & & & & & & & & & &&zynq& cat /sys/kernel/debug/gpio & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &&GPIOs 0-117, platform/e000a000.gpio, xgpiops: & & & & & & & & & & & & & & & & & & & & & & & & &&gpio-7 & (mmc_led & & & & & & ) out lo & & & & & & & & & & & & & & & & & & & & & & & & & & & &&gpio-55 &(OLED VBat & & & & & ) out lo & & & & & & & & & & & & & & & & & & & & & & & & & & & &&gpio-56 &(OLED VDD & & & & & &) out lo & & & & & & & & & & & & & & & & & & & & & & & & & & & &&gpio-57 &(OLED_RESET & & & & &) out hi & & & & & & & & & & & & & & & & & & & & & & & & & & & &&gpio-58 &(OLED_D/C & & & & & &) out hi & & & & & & & & & & & & & & & & & & & & & & & & & & & &&gpio-59 &(spi_gpio.2 & & & & &) out lo & & & & & & & & & & & & & & & & & & & & & & & & & & & &&gpio-60 &(spi_gpio.2 & & & & &) out lo & & & & & & & & & & & & & & & & & & & & & & & & & & & &&gpio-61 &(sysfs & & & & & & & ) out lo & & & & & & & & & & & & & & & & & & & & & & & & & & & &&gpio-62 &(sysfs & & & & & & & ) out lo & & & & & & & & & & & & & & & & & & & & & & & & & & & &&gpio-63 &(sysfs & & & & & & & ) out lo & & & & & & & & & & & & & & & & & & & & & & & & & & & &&gpio-64 &(sysfs & & & & & & & ) out lo & & & & & & & & & & & & & & & & & & & & & & & & & & & &&gpio-65 &(sysfs & & & & & & & ) out lo & & & & & & & & & & & & & & & & & & & & & & & & & & & &&gpio-66 &(sysfs & & & & & & & ) out lo & & & & & & & & & & & & & & & & & & & & & & & & & & & &&gpio-67 &(sysfs & & & & & & & ) out lo & & & & & & & & & & & & & & & & & & & & & & & & & & & &&gpio-68 &(sysfs & & & & & & & ) out lo & & & & & & & & & & & & & & & & & & & & & & & & & & & &&gpio-69 &(sysfs & & & & & & & ) in &hi & & & & & & & & & & & & & & & & & & & & & & & & & & & &&gpio-70 &(sysfs & & & & & & & ) in &lo & & & & & & & & & & & & & & & & & & & & & & & & & & & &&gpio-71 &(sysfs & & & & & & & ) in &lo & & & & & & & & & & & & & & & & & & & & & & & & & & & &&gpio-72 &(sysfs & & & & & & & ) in &hi & & & & & & & & & & & & & & & & & & & & & & & & & & & &&gpio-73 &(sysfs & & & & & & & ) in &hi & & & & & & & & & & & & & & & & & & & & & & & & & & & &&gpio-74 &(sysfs & & & & & & & ) in &lo & & & & & & & & & & & & & & & & & & & & & & & & & & & &&gpio-75 &(sysfs & & & & & & & ) in &hi & & & & & & & & & & & & & & & & & & & & & & & & & & & &&gpio-76 &(sysfs & & & & & & & ) in &lo & &&可以看到其中GPIO[55:60]被pmodoled驱动分配了,而GPIO[61:76]则是被sysfs分配了,最前面的GPIO[7]则是被linux的led驱动分配了,代码的位置是在drivers/leds/leds-gpio.c。最终要深入的话还是建议看内核源码和文档:drivers/gpio/gpiolib.cDocumentation/gpio.txt参考链接:
阅读(8869)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'ZedBoard Linux开发 --- GPIO驱动详解',
blogAbstract:'& & & & 本来这是要作为ZedBoard Linux的第一个学习实例,不过由于一开始实在找不到内核中针对ZedBoard GPIO具体操作的代码在哪里,所以只能先从OLED开始看起,在学习完OLED驱动之后有了不少发现,比如OLED驱动中就有使用GPIO的操作,后来发现这些操作都被Linux内核中的GPIOLIB库管理着,相关的文档在Documentation/gpio.txt中有介绍,通读一遍之后就会有不少发现的,相关的GPIOLIB库文件位于drivers/gpio/gpio-lib.c文件中,不过这部分文件只是提供了库函数,而真正在ZedBoard启动时进行GPIO注册管理的文件是drivers/gpio/gpio-xilinxps.c,可以在这个文件中找到这样一个宏定义:',
blogTag:'gpiolib,sysfs,gpio',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:2,
publishTime:5,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:true,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}}

我要回帖

更多关于 xilinx官网 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信