Linux开发追踪(IMX6ULL篇_第一部分)
前言
参数:cortex-A7 698Mhz flash 8GB RAM 512M DDR3
2个100M网口 单核
初期:
一、安装完虚拟机之后,第一步先设置文件之间可以相互拷贝复制,以及通过CRT连接到虚拟机等
折磨死人了啊啊啊啊啊啊
1、关于SSH怎么安装指令都有,然后启动SSH服务就行,查看等
入坑点:1.window下一定要看有没有网络适配器VM8这样的,并且和主机,以及虚拟机三者在同一网络下,如果没有适配器,卸载重装,删除注册表
2.NAT无法连接,必须桥接模式,然后查看ip地址必须是同一网段内的
3.设置网络编辑器
4.一定虚拟机和window下相互ping通才行,然后CRT登录Ubuntu的ip地址,以及用户名就行了
二、第二个折磨死人的就是SAMBA,虚拟机映射到window了
参考:第四课:安装samba映射网络磁盘到本地_云服务器samba如何映射到本地-CSDN博客
其中静态路由,最后启用工作站那么起始都不需要,
配置文件可以这样写:无论是ubuntu的登录名还是文件名都是dzc
创建添加的samba的用户名也是dzc密码1,这个就是最后有个网络凭证需要登录的用户名和密码
还有一点,一定要使用桥接的方式,两者之间也要ping通
防火墙要关掉,实在不行可以卸载重装
还有一种方式就是使用仅主机模式,适用于同一台电脑主机和虚拟机共享连接
第一步选择VM1的主机模式
然后配置虚拟网络编辑器
主机虚拟网卡配置
最后看主机和虚拟机之间能不能相互ping通,然后就可以登录SECURE CRT 和SMBA了。
三、取任一个ubuntu软件,第一步是交叉编译工具安装
第二步创建文件夹 拷贝过去之后,解压文件 tar -xvf
sudo cp gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz /usr/local/arm/ -f
添加环境变量:
export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
设置完之后重启生效,检查版本号
第二步是安装VSCODE :建议下载最新版
插件安装
找到设置,字体,中文,不要使能预览
下面的USB是串口,要用跳线帽修改
不建议使用引脚复用,会增加设备树,很麻烦。
中期:准备上手
汇编学习:
.text 代码段
.data 初始化的数据段
.bss 未初始化的数据段
.rodata 只读数据段
__start: 默认标号入口
汇编也可以写函数
常用的汇编指令:
MOV指令:把一个寄存器拷贝到另一个寄存器中,或者将一个立即数传递到寄存器中,后面传递到前面。
MVO RO,R1
MRS指令:用于将特殊寄存器如CPSR,传递到普通的寄存器中,MRS R0,CPSR
MSR指令:用于将普通寄存器传递到特殊寄存器中,MSR CPSR, R0
BX是返回指令
存储器访问指令:LDR 指令,从存储器加载数据到Rx中,LDR也可以把立即数加载到Rx中,LDR加载立即数的时候要用 = 不是 #
常用的就是读取CPU的寄存器值 LDR R0, = 0X0209C004 LDR R1, [R0]
STR 指令,就是将数据写入存储器中,比如LDR R0, 0X0209C004 LDR R1, = 0X20000002
STR R1, [R0] 把R1的值写入到R0所保存的地址中
压栈和出栈指令:
PUSH {R0~R3, R12} @将 R0~R3 和 R12 压栈
PUSH {LR}
出栈顺序
POP {LR}
POP {R0~R3,R12}
跳转指令:
如B,BL,BX,BLX等
直接向PC寄存器写入数据
算数运算命令:
逻辑运算命令:
熟悉数据手册和寄存器
1、先看原理图找到对应使用的GPIO以及功能,然后手册中在IOMUXC_SW_MUX_XX中先找到当前引脚,比如GPIO1_IO3,这个是他的复用寄存器,然后找到地址20E_0068h,寄存器表可以看出只有低5位有效,复用为普通的gpio的话就配置成0101,也就是0x05,(如果想配置成其他IIC或者USB功能配成其他数字)。/
2、然后要使能时钟,找到时钟标题,CCM,找到CCGR0-CCGR6,一般都是要全部使能就行,找到这7个寄存器组的地址,然后分别使能为0xFFFFFFFF。
比如地址是20C_4068h 通过STR 写入0xFFFFFFFF,其他6个寄存器也一样
3、然后是电气寄存器,在手册中找IOMUXC_SW_PAD_XX,由低位到高位依次是:
SRE:压摆率 默认为低,当需要高速IO时候,置1
DSE:设置IO的驱动能力 0表示输出驱动关闭,为1看手册,分母越大驱动能力越强
SPEED:设置IO速度,00 50M 01 100M 11 200M
ODE:开路输出 0关闭开漏, 1打开开漏
PKE,上下拉保持 0 上拉保持 1关闭上下拉
PUE设置状态保持, 0 保持 1上啦
PUS设置上下拉电阻, 00 100K 11 22K
HYS:用不到,使能迟滞比较器
4、这几个寄存器都找到之后,记录地址,后面写汇编初始化要用,然后就是配置GPIO功能,
找到Purpose Input/Output (GPIO) GPIO的寄存器组 看标题 找到GPIO data register
注意:GPIO只是IO众多复用的一个小配置,当你选择把IO配置成GPIO后还需要,另外配置GPIO的一些功能,DR、 GDIR、 PSR、 ICR1、 ICR2、 EDGE_SEL、 IMR 和 ISR这八种寄存器
其中,一共5组,这里用GPIO1 设置GPIO1_DR
数据寄存器DR 比如要设置 GPIO1_IO00 输出高电平,那么就应该设置 GPIO1.DR=1
如果是输入,那么就是读取电平状态
GDIR:设置IO的输入还是输出 输入0 输出1
PSR:功能和输入状态下的 DR 寄存器一样
ICR1和ICR2这两个寄存器,都是中断控制寄存器, ICR1用于配置低16个GPIO, ICR2 用于配置高 16 个 GPIO
IMR用来控制GPIO的中断禁止和使能,使能1,禁止0
ISR:中断状态寄存器,只要某个GPIO中断发生,ISR相应位就是1,处理完中断要清楚
EDGE_SEL 寄存器,这是边沿选择寄存器,会覆盖ICR1和ICR2,无论设置多少都是双边沿触发
这里控制LED,只需要设置DR和GDIR就行了。
LED实验:引脚是IO3 GPIO1
对于Linux也就是cortex-A系列的开发,基本都要先写汇编代码,初始化外设部分
部分需要汇编初始化DDR,然后把指针SP指向DDR。
如何查看对应的引脚和寄存器配置,Linux的引脚和电气属性是单独两个寄存器
引脚看这几位就行
开发步骤:(如上)
先写汇编程序:示例如下
.global _start @LED IO GPIO1—3
_start:@先初始化时钟ldr r0, = 0x020c4068 @ccgr0ldr r1, = 0xffffffffstr r1, [r0] @数据写入ldr r0, = 0x020c406C @CCM_CCGR1str r1, [r0]ldr r0, = 0x020c4070 @CCM_CCGR2str r1, [r0]ldr r0, = 0x020c4074 @CCM_CCGR3str r1, [r0]ldr r0, = 0x020c4078 @CCM_CCGR4str r1, [r0]ldr r0, = 0x020c407C @CCM_CCGR5str r1, [r0]ldr r0, = 0x020c4080 @CCM_CCGR6str r1, [r0]@配置复用寄存器属性ldr r0, = 0x020E0068 ldr r1, = 0x05str r1, [r0]@配置电气属性
/*bit0 压摆率
bit5:3 110 R0/6 驱动能力
bit7:6 10 100M
bit11 0 关闭
bit12 1 时能 pull
bit13
bit15:14 00 100k 下拉
bit16*/ldr r0, = 0x020E02F4ldr r1, = 0x10b0str r1, [r0]@设置gpio功能
/*找到gpio的基地址
bit 0 就是 io0 bit1就是io1 bit2就是io2 bit3就是io3
gpio1_dr 209_C000
gpio1_gdir 209_C004
gpio1_psr 209_C008
*/ldr r0, = 0x0209C004 @设置GDIR为输出ldr r1, = 0x8str r1, [r0]/*打开LED*/ldr r0, = 0x0209C000 @设置dr为输出ldr r1, = 0x0str r1, [r0]loop:b loop
然后写驱动编译程序:
把.c.s文件变成.o文件,先把汇编 变成目标文件
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
将所有的.o文件链接为elf格式的可执行文件,本实验链接的起始地址是 0x87800000 (就是代码运行的起始地址)可以指向内部的RAM也可以指向外部的DDR核心板中,
arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elf
将elf文件转为bin文件,在32中,是可以直接把flash中的代码拷贝到RAM中运行的,cortex-A的不能直接拷贝,需要把bin文件拷贝到SD卡中,然后放到设备的flash中运行。
arm-linux-gnueabihf-objcopy -O binary -g -S led.elf led.bin
将elf文件转为汇编,反汇编,这样RAM就可以识别了,RAM只认那15个寄存器
程序烧录部分
32可以直接把代码烧录到内部flash中,cortex没有内部flash,需要借助SD卡,EMMC,NAND,NOR,SPI flash等方式启动,
1.需要把SD卡挂载到虚拟机中
2. 把F:\百度网盘下载\资料2\【正点原子】阿尔法Linux开发板(A盘)-基础资料\05、开发工具\02、Ubuntu下裸机烧写软件 路径下的 imxdownload文件拷贝到 编译文件夹中,给权限
然后执行命令格式 ls /dev/sd* -l 查看硬盘路径 插拔确认SD卡路径
如果发现U盘或SD卡始终连接不到虚拟机,可以试着修改.vmx文件的
执行操作后,会把bin文件生成为load.imx文件
拨码开关设置为SD卡启动,重启,点亮LED