目的:
并不是系统的学习汇编,而是在linux开发中有时候需要使用汇编置零进行一些初始化的工作。
1. I.MX6ULL的IO初始化流程:
6ULL的IO命名:IOMUXC_SW_MUC_CTL_PAD_XX_XX,加黑部分就是GPIO的命名。
① 使能时钟:
参考手册中说明了CCGR0-CCGR6七个寄存器控制设备所有外设时钟的使能,每个寄存器都设置为0xFFFFFFFF,也就是将每个寄存器的所有位设置为1,相当于使能所有外设时钟。
② IO复用:
复用寄存器:IOMUXC_SW_MUX_CTL_PAD_XX_XX。第三个字段为MUX。
参考手册第32章节中找到对应IO,查看寄存器MUX_MODE栏即可查看复用。该实验中将其bit3-0设置为0101即可。
③ 电气配置:
电气寄存器:IOMUXC_SW_PAD_CTL_PAD_XX_XX。第三个字段为PAD。
结合6ULL驱动开发指南中的IO功能图和参考手册的32章来看。主要是设置SRE压摆率,SPEED速度,DSE驱动能力,开漏,上下拉等。
④ GPIO功能配置:
设置输入输出。参考手册第28章,驱动开发指南8.1.5。
主要涉及GPIOx_DR寄存器和GPIOx_GDIR寄存器,GDIR寄存器设置GPIO为输入或输出模式,输入则往DR寄存器中读,输出则往DR寄存器中写。该实验中设置GDIRbit3=1,输出模式,DR的bit3=1/0,表示输出高/低电平。
2. GNU汇编基本语法:
注意ARM中指令,伪指令,操作,伪操作,寄存器名等可以全大写或小写,不可以大小写混用。
语句规范:label: instruction @ comment
label:标号,表示地址位置,任何以“:”结尾的都是标号,标号也可以作为一个函数使用。
instruction:汇编指令或伪指令,必须有,不可以空着。
@ comment:注释。
常用指令见驱动开发第七章。
3. 驱动编写及编译:
①Code:略
②编译程序:
1.使用linaro将.c.s文件变为.o
2.将.o文件链接为elf格式的可执行文件。6ULL链接起始地址在RAM中,建议使用0x87800000,因为后面Uboot的链接地址也是这个,统一一下。
3.将elf文件转为bin文件。对于I.MX来说bin文件不能直接运行,需要添加一个头部(其中包含了DDR的初始化参数),从SD卡,EMMC等外部存储中读取头部信息,将bin文件拷贝到链接起始地址。
4.将elf转为汇编,反汇编。
一般来说bin文件生成之后就可以烧写了,但是我们一般用C写例程,有时候调试需要查看汇编代码,需要将elf文件反汇编。
③烧写bin文件:
可以用EMMC,NAND,SPI flash等启动,用官方提供的软件但是有点麻烦。裸机开发还是烧到SD卡方便。烧写指的是将bin文件烧写到SD卡绝对地址上,对于I.MX来说必须现在bin文件前面添加头部再烧写。
1.先往路径下添加imxdownload文件。
2.执行烧写命令之前先查看SD卡对应的设备名,通过插拔发现是sdb/sdb1:
3.烧写:(imxdownload给bin文件添加了头部,生成load.imx文件并烧写进去)
4.上板,将启动模式调为SD卡启动(板子上的红模块17拨上,其它位拨下),插入SD卡,复位,发现红灯亮起来了,说明驱动成功。
将刚才的操作整合成Makefile文件,一步到位: