M3352 Linux内核简要说明
- 格式:pdf
- 大小:834.22 KB
- 文档页数:26
linux中,内核的物理内存分配的基本方式标题:Linux中的内核物理内存分配机制解析引言:在Linux操作系统中,内核是操作系统的核心,负责管理资源、执行任务和提供系统服务。
其中,内核的物理内存分配方式是内核管理的重要组成部分。
本文将详细介绍Linux内核中的物理内存分配基本方式,并逐步解析其过程。
读者可以通过本文了解Linux内核是如何管理系统的物理内存资源的。
第一部分:物理内存管理的基础知识1.1 内核物理内存管理的基本概念1.2 Linux内核中的物理内存管理的重要性1.3 内核地址空间和用户地址空间的区别第二部分:物理内存分配的基本原则2.1 内存管理单元(Memory Management Unit,MMU)的作用2.2 内存分配的三个基本原则2.3 分页和分段的内存管理机制第三部分:Linux内核的内存分配器3.1 内存分配函数的作用3.2 连续内存分配器3.2.1 伙伴系统(Buddy System)的原理和实现3.2.2 固定大小的内存块分配器(Slab Allocator)的原理和实现第四部分:物理内存分配的具体过程4.1 内核启动时的物理内存初始化4.2 内核的提前分配4.3 运行时动态分配物理内存4.3.1 页面分配算法4.3.2 页面回收算法第五部分:内存分配中的管理机制5.1 内存热插拔和内存热替换5.2 内存保护和内存隔离5.3 内存映射和虚拟内存管理5.4 高速缓存的管理第六部分:内核物理内存分配的性能优化6.1 伙伴系统的改进6.2 页面预分配和惰性分配6.3 内存压缩和内存回收结论:本文全面解析了Linux内核中物理内存分配的基本方式。
从物理内存管理的基础知识、物理内存分配的基本原则,到Linux内核的内存分配器和具体分配过程,再到内存管理中的机制和性能优化等方面进行了详细的阐述。
读者可以通过本文了解到Linux内核是如何高效管理系统的物理内存资源的,并且在实践中可以根据需要进行相应的性能优化调整。
本文主要描述在EVB335X-II以Device Tree的方式移植新TI官网AM335X系列最新的linux-3.14.43版本内核以及移植Debian文件系统的过程及遇到的一些问题。
整个Device Tree牵涉面比较广,即增加了新的用于描述设备硬件信息的文本格式(即.dts文件),又增加了编译这一文本的工具,同时Bootloader也需要支持将编译后的Device Tree传递给Linux内核。
以下是修改步骤:一、修改uboot,支持Device TreeEVB335X-II在linux-3.2版本内核移植的时候已经有uboot,因此只需在该uboot上增加Device Tree支持即可,以下是修改步骤:1、修改include/configs/com335x.h文件,增加支持DT的宏定义:/* Flattened Device Tree */#define CONFIG_OF_LIBFDT2、修改uboot启动参数,增加dtb文件的加载和启动(由于目前只是移植EMMC版本的EVB335X-II,因此只需修改EMMC的启动参数即可,大概在405行),修改如下:#elif defined(CONFIG_EMMC_BOOT)#define CONFIG_BOOTCOMMAND \"run mmcboot;"#define CONFIG_EXTRA_ENV_SETTINGS \"lcdtype=AUO_AT070TN94\0" \"console=ttyO0,115200n8\0" \"mmcroot=/dev/mmcblk0p2 rw\0" \"mmcrootfstype=ext4 rootwait\0" \"mmcargs=setenv bootargs console=${console} noinitrd root=${mmcroot} rootfstype=${mmcrootfstype} lcdtype=${lcdtype} consoleblank=0\0" \"mmcdev=" MMCDEV "\0" \"loadaddr=0x81000000\0" \"dtbfile=evb335x-ii-emmc.dtb\0" \"bootenv=uEnv.txt\0" \"bootpart=" BOOTPART "\0" \"loadbootenv=load mmc ${mmcdev} ${loadaddr} ${bootenv}\0" \"importbootenv=echo Importing environment from mmc ...; " \"env import -t $loadaddr ${filesize}\0" \"loadaddr-dtb=0x82000000\0" \"loadimage=load mmc ${bootpart} ${loadaddr} uImage\0" \"loaddtb=load mmc ${bootpart} ${loadaddr-dtb} ${dtbfile}\0" \"mmcboot=mmc dev ${mmcdev}; " \"if mmc rescan; then " \"echo SD/MMC found on device ${mmcdev};" \"if run loadbootenv; then " \"echo Loaded environment from ${bootenv};" \"run importbootenv;" \"fi;" \"run mmcargs;" \"if run loadimage; then " \"run loaddtb;" \"bootm ${loadaddr} - ${loadaddr-dtb};" \"fi;" \"fi; \0"#endif以上,红色为修改部分。
WYP—2016/9/11—周总结经过一周的学习,对电鱼派的电路原理图有了一定的了解,也基本学会了怎么去看一张原理图。
对于一张开发板的原理图,我个人一般把它分成几个模块,然后按照模块去学习每一部分电路图。
每个模块学习完之后,在将所有模块联系在一起综合起来学习。
我将电鱼派的原理图分成了如下模块:CPU,存储模块,电源模块,串口模块,网卡模块,基础接口模块,裸板测试模块,显示模块,HUB模块。
1、存储模块在电鱼派中的存储芯片有以下几块,DDR,NANAFLASH,以及外插得TF卡。
首先来看看DDR芯片,DDR=Double Data Rate双倍速率同步动态随机存储器。
严格的说DDR应该叫DDR SDRAM,人们习惯称为DDR,其中,SDRAM 是Synchronous Dynamic Random Access Memory的缩写,即同步动态随机存取存储器。
而DDR SDRAM 是Double Data Rate SDRAM的缩写,是双倍速率同步动态随机存储器的意思。
DDR内存是在SDRAM内存基础上发展而来的,仍然沿用SDRAM生产体系。
Double Data Rate:与传统的单数据速率相比,DDR技术实现了一个时钟周期内进行两次读/写操作,即在时钟的上升沿和下降沿分别执行一次读/写操作。
在电鱼派的开发板上的DDR3芯片是美国麦克雷尔公司研发MT41K256M16HA-15E,内存为256M*16,循环次数CL=9,工作温度(0~95)摄氏度。
电鱼派中DDR3的原理图:DDR3个引脚功能如下:当然只知道引脚的功能是不够的还需要将芯片与CPU通过各总线相连,根据不同的需要配置不同的功能,配置不同的功能就需要配置不同的寄存器,这就要参照芯片手册上的资料对寄存器进行配置。
其次介绍NANDFLASH,Flash Memory中文名字叫闪存,是一种长寿命的非易失性(在断电情况下仍能保持所存储的数据信息)的存储器。
对于每一个配置选项,用户可以回答"y"、"m"或"n"。
其中"y"表示将相应特性的支持或设备驱动程序编译进内核;"m"表示将相应特性的支持或设备驱动程序编译成可加载模块,在需要时,可由系统或用户自行加入到内核中去;"n"表示内核不提供相应特性或驱动程序的支持。
只有<>才能选择M1. General setup(通用选项)[*]Prompt for development and/or incomplete code/drivers,设置界面中显示还在开发或者还没有完成的代码与驱动,最好选上,许多设备都需要它才能配置。
[ ]Cross-compiler tool prefix,交叉编译工具前缀,如果你要使用交叉编译工具的话输入相关前缀。
默认不使用。
嵌入式linux更不需要。
[ ]Local version - append to kernel release,自定义版本,也就是uname -r可以看到的版本,可以自行修改,没多大意义。
[ ]Automatically append version information to the version string,自动生成版本信息。
这个选项会自动探测你的内核并且生成相应的版本,使之不会和原先的重复。
这需要Perl的支持。
由于在编译的命令make-kpkg 中我们会加入- –append-to-version 选项来生成自定义版本,所以这里选N。
Kernel compression mode (LZMA),选择压缩方式。
[ ]Support for paging of anonymous memory (swap),交换分区支持,也就是虚拟内存支持,嵌入式不需要。
[*]System V IPC,为进程提供通信机制,这将使系统中各进程间有交换信息与保持同步的能力。
飞凌AM335x开发板Linux用户手册OK335X-Linux用户手册第一章OK335X简介OK335X开发板基于TI AM335X处理器,运行主频最高720M,支持Linux,WinCE,Android三大操作系统,可用于工业产品设计。
OK335X有核心板和底板组成,核心板主要芯片有:CPU,NandFlash,Memory,PowerManage。
使用我们的核心板,只需要根据您的业务需求开发自己的底板,这样可加速您的产品上市时间,让您从平台搭建的复杂环境中脱离。
下面我们具体描述OK335X核心板和底板资源。
OK335X产品图片如下所示:核心板硬件资源:1CPU主频:720M(支持AM3352,AM3354,AM3356,AM3357,AM3358,AM3359)2NandFlash:256M(Micro SLC)3Memory:265M(Micro DDR2)4PowerManage IC:TPS65217B(TI AM335X专用电源IC)底板资源:14路串口(2个232电平,2个TTL电平,232电平已经使用DB9座子引出,其中COM0作为调试串口使用,注意:OK335X-V1底板中UART4暂时不能使用,下一硬件版本将修正这个问题)。
21路100M网口3音频接口(1路Phone输出,1路Line-in输入)41个SD卡接口56个用户按键63路I2C接口71个LCD接口(支持RGB888模式,支持电阻触摸和电容触摸。
默认标配7寸电阻屏)81路PWM接口,用于蜂鸣器测试。
91路Can接口101路SDIO接口11多路用户IO接口12四路USB2.0接口,一路USB2.0OTG(目前板子为一路USB Host接口,后续会增加到四路USB HUB)131路SPI接口148路AD(其中4路用于电阻触摸,1路用于滑动变阻器AD测试,其余3路通过插针引出,另外滑动变阻器端有跳线设置,通过跳线可以设置这路AD用于插针引出,还是用于可调电阻测试)15引出总线接口(缺省未焊接底座)161个RESET按钮,用于系统复位。
MYD-AM335X-J Linux 开发手册版本V1.12014/10/23版本记录目录第1章概述及软件资源介绍 (1)1.1 概述 (1)1.2 软件资源 (1)第2章Linux开发环境搭建 (3)2.1 建立工作目录 (3)2.2 设置交叉编译工具 (3)2.3 安装工具 (3)第3章Linux系统编译 (4)3.1 编译Bootloader (4)3.2 编译Linux内核 (5)3.3 制作文件系统 (5)第4章Linux 系统烧写 (6)4.1 TF卡系统映像更新 (6)4.2 NAND Flash更新/恢复 (7)第5章Linux应用程序 (10)5.1 GPIO (10)5.2 NET (10)5.3 RTC (11)5.4 LCD (11)5.5 Audio (12)5.6 I2C总线测试 (12)5.7 串口 (12)5.8 RS485 (12)5.9 CAN (13)5.10 引脚功能切换 (13)5.10.1 RS485_1跟UART5_RTSCTS 切换145.10.2 RS485_2和UART3切换及CAN1和UART4切换15第6章Qt开发 (17)6.1 使用光盘提供的Qt SDK (17)6.2 交叉编译Qt开发环境 (17)6.3 移植Qt到开发板 (18)6.4 交叉编译Qt应用程序 (19)第1章概述及软件资源介绍1.1 概述MYD-AM335X-J提供了丰富的系统资源和软件资源,本手册将从环境搭建开始,一步步介绍如何进行MYD-AM335X-J Linux开发。
本手册中开发主机上的命令以Ubuntu为例进行教授。
1.2 软件资源表1-1第2章Linux开发环境搭建2.1 建立工作目录拷贝MYD-AM335X-J光盘中的资料到主机中:$ mkdir -p <WORKDIR>$ cp -a <DVDROM>/05-Linux_Source/* <WORKDIR>2.2 设置交叉编译工具$ cd <WORKDIR>/Toolchain$ tar -xvjf \gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux.tar.bz2$ export PATH=$PATH:<WORKDIR>/Toolchain/\gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux/bin$ export CROSS_COMPILE=arm-linux-gnueabihf-执行完“export”命令后输入arm按Tab键来检查是否设置成功,该设置只对当前终端有效,如需永久修改,请修改用户配置文件。
OK335X-Linux用户手册第一章OK335X简介OK335X开发板基于TI AM335X处理器,运行主频最高720M,支持Linux,WinCE,Android三大操作系统,可用于工业产品设计。
OK335X有核心板和底板组成,核心板主要芯片有:CPU,NandFlash,Memory,PowerManage。
使用我们的核心板,只需要根据您的业务需求开发自己的底板,这样可加速您的产品上市时间,让您从平台搭建的复杂环境中脱离。
下面我们具体描述OK335X核心板和底板资源。
OK335X产品图片如下所示:核心板硬件资源:1CPU主频:720M(支持AM3352,AM3354,AM3356,AM3357,AM3358,AM3359)2NandFlash:256M(Micro SLC)3Memory:265M(Micro DDR2)4PowerManage IC:TPS65217B(TI AM335X专用电源IC)底板资源:14路串口(2个232电平,2个TTL电平,232电平已经使用DB9座子引出,其中COM0作为调试串口使用,注意:OK335X-V1底板中UART4暂时不能使用,下一硬件版本将修正这个问题)。
21路100M网口3音频接口(1路Phone输出,1路Line-in输入)41个SD卡接口56个用户按键63路I2C接口71个LCD接口(支持RGB888模式,支持电阻触摸和电容触摸。
默认标配7寸电阻屏)81路PWM接口,用于蜂鸣器测试。
91路Can接口101路SDIO接口11多路用户IO接口12四路USB2.0接口,一路USB2.0OTG(目前板子为一路USB Host接口,后续会增加到四路USB HUB)131路SPI接口148路AD(其中4路用于电阻触摸,1路用于滑动变阻器AD测试,其余3路通过插针引出,另外滑动变阻器端有跳线设置,通过跳线可以设置这路AD用于插针引出,还是用于可调电阻测试)15引出总线接口(缺省未焊接底座)161个RESET按钮,用于系统复位。
广州致远电子股份有限公司AM3352串口启动指南基于M3352_EV_BOARD 评估板修订历史目录1. 适用范围 (1)2. 原理概述 (2)3. 开发环境 (3)4. 技术实现 (4)4.1 连接调试串口 (4)4.2 更新uboot (4)4.2.1 下载SPL (4)4.2.2 下载uboot (5)4.2.3 下载MLO (6)5. 免责声明 (8)1. 适用范围2. 本文基于M3352_EV_BOARD评估板,主要介绍如何从串口启动AM3352处理器并实现uboot的更新,其原理和方法同样适用于EPC-9100I-L、EPC-9200I-L、EPC-9600I-L工控主板以及所有基于M3352-N128LI工控核心板拓展的硬件平台。
原理概述AM3352处理器支持存储器启动以及外设启动。
上电后,处理器根据启动引脚的设置执行相应的一级引导代码(即固化在芯片内部的ROM Code)。
当选择从外设启动的时候,可以通过UART接口下载二级引导代码SPL(用来初始化内存、时钟和电源等)。
SPL执行完毕,处理器可再次通过UART接口下载uboot镜像文件,然后将控制权移交到uboot。
此后,还需要通过uboot来接收用于Nand Flash启动的二级引导代码MLO以及uboot镜像,并将它们烧写到Nand Flash中,从而实现处理器再次上电时从Nand Flash启动。
3. 开发环境1)硬件清单:M3352_EV_BOARD评估板。
2)软件资源:产品光盘资料:M3352-N128LI CD V1.03;附件:●二级引导代码镜像文件(串口启动用):u-boot-spl.bin;●uboot镜像文件:u-boot.img;●二级引导代码镜像文件(Nand Flash启动用):MLO。
4. 技术实现4.1 连接调试串口注意:本文要求终端软件支持“Xmodem 1K”、“Ymodem”以及“Kermit”文件传输协议,如Tera Term v4.67;Windows XP系统推荐使用自带的“超级终端”软件。
目录第1章M3352 Linux内核简要说明 (1)1.1文档意图 (1)1.2适用范围 (1)1.3驱动源码列表 (1)1.4编译说明 (1)1.5uImage镜像 (2)1.6编译驱动 (2)第2章内核修改 (3)1.1修改液晶参数 (3)2.1.1使用配套的TFT 4.3寸、LCD 7寸液晶屏 (3)2.1.2使用其他的液晶屏 (3)2.2SPI和SPIDEV (5)2.2.1内核修改 (5)2.3使用SPIDEV (6)2.3.1重要的数据结构 (7)2.3.2获得同SPI设备通信的设备节点 (9)2.3.3用户空间同设备节点的接口 (10)2.3.4用户空间的测试例程 (11)2.4CAN改GPIO (17)2.5音频改GPIO (19)2.6其它功能改GPIO (21)2.7NAND兼容处理——重要!!! (21)2.8增加PPP模块 (22)第3章驱动编写说明 (24)3.1GPIO和外部中断 (24)3.1.1修改内核 (24)3.1.2编写驱动 (24)3.1.3测试 (25)i第1章M3352 Linux内核简要说明1.1 文档意图目的在于让开发者快速了解M3352内核源码结构,驱动位置以及编译方法。
本文档不对内核实现或者代码技巧进行任何介绍,亦不对内核级开发做技术支持。
1.2 适用范围本说明适用于致远电子基于AM3352处理器的全部工控核心板、主板产品,包括M3352-N128LI,M3352-128LI-PZ和EPC-9600I-L。
1.3 驱动源码列表M3352主要外设和驱动如表1.1所示。
表 1.1 外设和驱动列表1.4 编译说明默认配置文件:arch/arm/configs/m3352_defconfig在编译的时候,需要指定体系结构为ARM,并指定交叉工具链:make CROSS_COMPILE=$CC ARCH=arm,而不能简单的输入make。
在源码根目录下有一个build脚本,请根据实际情况修改交叉编译器的路径,直接运行该脚本即可编译内核。
Build脚本内容如下:build#!/bin/shCC=/home/chenxibing/ti-sdk-am335x-evm-05.05.01.00/linux-devkit/bin/arm-arago-linux-gnueabi-make CROSS_COMPILE=$CC ARCH=arm distcleanmake CROSS_COMPILE=$CC ARCH=arm m3352_defconfig1make CROSS_COMPILE=$CC ARCH=arm menuconfigmake CROSS_COMPILE=$CC ARCH=arm uImage -j8make CROSS_COMPILE=$CC ARCH=arm modulessudo make CROSS_COMPILE=$CC ARCH=arm modules_install1.5 uImage镜像M3352采用uImage镜像,Linux内核通常编译得到的是zImage镜像,需要经过转换才能得到uImage镜像。
这就需要用到mkimage工具,如果本机没有该工具,请下载一份u-boot源码,采用任意配置后编译,将会在tools目录下得到mkimage文件,将mkimage文件复制到系统/usr/bin目录后即可。
1.6 编译驱动如果需要在内核数外编译驱动,将驱动作为模块独立加载,则在驱动的Makile中,需要指定内核路径为M3352源码路径。
同样,编译驱动也需要指定体系结构为ARM,并指定交叉编译工具链,也不能简单的make,否则依然出错。
2第2章内核修改1.1 修改液晶参数2.1.1 使用配套的TFT 4.3寸、LCD 7寸液晶屏EPC-9600产品默认配置的为TFT 4.3寸液晶参数。
如果需要配置为LCD 7寸液晶显示(LCD_TM070RDH12_24B),只需要打开源码中\arch\arm\mach-omap2\board-m3352.c,找到程序代码,如程序清单1.1所示。
注释TFT 4.3寸液晶参数,改为LCD 7寸液晶参数,如程序清单1.2所示。
程序清单1.1 lcdc_pdata的赋值(一)//lcdc_pdata = &TFC_S9700RTWV35TR_01B_pdata;lcdc_pdata = &TFT_HW480272_pdata;程序清单1.2 lcdc_pdata的赋值(二)lcdc_pdata = &TFC_S9700RTWV35TR_01B_pdata;//lcdc_pdata = &TFT_HW480272_pdata;保存并重新编译源码。
2.1.2 使用其他的液晶屏1.修改已有的液晶参数项打开源码中\arch\arm\mach-omap2\board-m3352.c,查看选择的液晶参数,如程序清单2.1所示。
程序清单2.1 lcdc_pdata的赋值(三)//lcdc_pdata = &TFC_S9700RTWV35TR_01B_pdata;lcdc_pdata = &TFT_HW480272_pdata;此处默认选择的为TFT_HW480272。
打开源码中\drivers\video\da8xx-fb.c,查找“TFT_HW480272”,找到相应的参数,如程序清单2.2所示。
程序清单2.2 TFT 4.3寸液晶参数[4] = {.name = "TFT_HW480272-0B-0A",.width = 480,// 屏幕x轴像素长度.height = 272,// 屏幕y轴像素长度.hfp = 8,// 水平前沿.hbp = 43,// 水平后沿.hsw = 4,// 水平同步信号脉冲宽度.vfp = 4,// 垂直前沿.vbp = 12,// 垂直后沿.vsw = 10,// 垂直同步信号脉冲宽度.pxl_clk = 9000000,// 像素时钟频率3.invert_pxl_clk = 0,},修改参数值,保存并重新编译源码。
注意:.name = "TFT_HW480272-0B-0A",不能修改。
2.添加新的液晶参数项(1)打开源码中\arch\arm\mach-omap2\board-m3352.c,找到结构体定义,如程序清单2.3所示。
程序清单2.3 TFT_HW480272_pdata结构体struct da8xx_lcdc_platform_data TFT_HW480272_pdata = {.manu_name = "HuaWei",.controller_data = &lcd_cfg,.type = "TFT_HW480272-0B-0A",};在其下方添加新的结构体定义,如程序清单2.4所示。
程序清单2.4 LCD_NEW800600_pdata结构体struct da8xx_lcdc_platform_data LCD_NEW800600_VGA_pdata = {.manu_name = "Your_Name",.controller_data = &lcd_cfg,.type = "LCD_NEW800600_VGA", //值与程序清单2.7中.name一致};(2)找到lcdc_pdata的赋值,如程序清单2.5所示。
程序清单2.5 lcdc_pdata的赋值(四)//lcdc_pdata = &TFC_S9700RTWV35TR_01B_pdata;lcdc_pdata = &TFT_HW480272_pdata;将这两项都屏蔽掉,并在其下方添加一行新的赋值,如程序清单2.6所示。
程序清单2.6 lcdc_pdata的赋值(五)//lcdc_pdata = &TFC_S9700RTWV35TR_01B_pdata;//lcdc_pdata = &TFT_HW480272_pdata;lcdc_pdata = &LCD_NEW800600_VGA_pdata;(3)打开源码中\drivers\video\da8xx-fb.c,找到结构体数组known_lcd_panels[],在下面添加新的液晶参数,如程序清单2.7所示。
程序清单2.7 LCD_NEW800600_VGA液晶参数[5] = {.name = "LCD_NEW800600_VGA",.width = 800, // 屏幕x轴像素长度.height = 600, // 屏幕y轴像素长度.hfp = 20, // 水平前沿.hbp = 200, // 水平后沿4.hsw = 1, // 水平同步信号脉冲宽度.vfp = 4, // 垂直前沿.vbp = 12, // 垂直后沿.vsw = 1, // 垂直同步信号脉冲宽度.pxl_clk = 30000000, // 像素时钟频率.invert_pxl_clk = 0,},程序清单2.7为添加的VGA_800x600液晶参数,仅供参考。
这些参数值可以在对应液晶屏的数据手册中查阅。
添加、添加液晶参数之后,保存并重新编译源码。
注意:程序清单2.4中.type的值,必须要与程序清单2.7中.name的值保持一致。
2.2 SPI和SPIDEV2.2.1 内核修改以SPI0为例进行介绍。
首先根据硬件引脚分配,选择正确的引脚功能。
引脚功能配置可以参考文件:arch/arm/mach-omap2/mux33xx.c。
例如spi0相关的引脚如下:_AM33XX_MUXENTRY(SPI0_SCLK, 0,"spi0_sclk", "uart2_rxd", "i2c2_sda", NULL, NULL, NULL, NULL, "gpio0_2"),_AM33XX_MUXENTRY(SPI0_D0, 0,"spi0_d0", "uart2_txd", "i2c2_scl", NULL, NULL, NULL, NULL, "gpio0_3"),_AM33XX_MUXENTRY(SPI0_D1, 0,"spi0_d1", "mmc1_sdwp", "i2c1_sda", NULL, NULL, NULL, NULL, "gpio0_4"),_AM33XX_MUXENTRY(SPI0_CS0, 0,"spi0_cs0", "mmc2_sdwp", "i2c1_scl", NULL, NULL, NULL, NULL, "gpio0_5"),_AM33XX_MUXENTRY(SPI0_CS1, 0,"spi0_cs1", "uart3_rxd", NULL, "mmc0_pow", NULL, "mmc0_sdcd", NULL, "gpio0_6"), 红色部分是某个引脚的8种功能,没有的功能以NULL表示。