买来开发板已经有一段时间了,刚接触时兴奋至极,后来跟着视频看下去发现似乎自己并没有学到太多东西,于是发现自己可能欠缺的太多以致从课程中无法提取出重要的东西来,所以并没有得到太多的营养成分。因此我个人认为我们还是有必要通过进行实验,在过程中边做边学,这样慢慢进行储备自己的知识。今天我先从GPIO实验进行总结和归纳出自己遇到的一些问题。
首先我们要在linux下进行程序的开发,然后将程序发送到windows下,并通过USB转串口烧录到我们的开发板上进行运行,那么在进行一个实验之前首先要将自己的工具准备好,这样才能正常进行下去。
关于我个人而言,在之前我是通过windows下的串口工具secureCRT,该工具可以进入uboot的界面,通过uboot界面的一些选项来进行下载,通过dnw工具进行文件的传送,它是一个usb工具,可以通过它对具有usb下载功能的bootloader。对于串口工具的使用,我们需要进行安装串口驱动(我看了开发板上使用的是PL2303TA芯片,这里应安装相应的驱动PL2303),我们也可以通过驱动精灵进行安装。对于dnw也需要进行驱动的安装,我这里通过一个zadig软件进行安装的。
实验一:led1的点亮(汇编语言进行编写)
(1)首先我们看一下led原理图
从上图来看,led是上拉方式
led对应着s3c2440的三个管脚(GPF4,GPF5,GPF6)
(2)这里要使用到的寄存器有GPFCON和GPFDAT,通过读写寄存器的地址来访问寄存器,其中GPFCON可以进行设置引脚的输入输出以及中断等功能,改变GPFDAT相应位可以改变引脚电平状态。
(3)相关的信息
寄存器地址:
GPFCON:0x56000050
GPFDAT: 0x56000054
GPFCON控制相应引脚的位:
GPF4: [9:8]
GPF5: [11:10]
GPF6: [13:12]
(4)程序:
led.S
.text @代码段
.global _start @全局函数
_start:
ldr r0,0x56000050
mov r1,#0x00000100
str r1,[r0]
ldr r0,0x56000054
mov r1,#0x00000000
str r1,[r0]
halt_loop:
b halt_loop
Makefile:
led.bin: led.S
arm-linux-gcc -g -c -o led.o led.S //编译不链接
arm-linux-ld -Ttext 0x00000000 -g led.o led_elf //链接(指定运行地址)
arm-linux-objcopy -O binary -S led_elf led.bin
clean:
rm -f led_elf led.bin *.o
(5)我们进行make后,就生成了led.bin文件,然后烧录到开发板中,切换nand启动,nand前4k的代码就被复制到SRAM中开始执行,这样就可以看到现象了,如果没有现象的话,再进行分析,查找原因
通过本次实验的同时也遇到了许多的拦路虎,然后就进行下一环节我将进行归纳:
工具的准备过程中:
1》由于我使用的是学校的局域网,笔记本电脑上仅仅支持无线网卡,没有路由,不能使用tftp方式进行文件的上传,于是就尝试使用dnw进行文件的上传。在dnw驱动的安装过程中,我第一次使用的是百问网的dnw驱动,该驱动由于未知原因不能正常使用。于是在群中进行探讨,他们使用的是新版本的dnw v5.2,使用了几天后又出现问题。我发现有可以在linux下的dnw_for_linux和dnw一样的效果,并且可以在linux下直接文件上传,通过linux下的超级终端minicom进行对uboot界面进行控制。于是乎我有开启了这条小路,但是小路不好走,最终败在minicom下的乱码。无奈之下我又试了一下原先方法,最后我居然成功了。
远水不解近渴,我还是先用这种方法进行学习吧,毕竟浪费了我两天多的时间。我列出下面的问题,如果有解决的博友们,希望你们可以可以留言告知我(下面留言或扣扣:2582305540),在这里谢谢各位了。
首先是dnw_for_linux的安装:
dnw_for_linux下载地址:http://linux.linuxidc.com/
参考文档:http://www.linuxidc.com/Linux/2011-12/48966.htm
http://blog.csdn.net/u011452544/article/details/39393857
http://www.linuxidc.com/Linux/2011-12/48961.htm
1># tar xvf dnw_for_linux.tar.gz 对压缩包进行解压
注意:secbulk目录下是PC端USB驱动, dnw目录是下载工具
2># cd /mnt/hgfs/file/dnw_for_linux/secbulk/ --打开secbulk
# make -C /lib/modules/2.6.31-14-generic/build/(此处是空格) M=/mnt/hgfs/file/dnw_for_linux/secbulk/ --切换到上面的目录,编译usb驱动模块
注意:2.6.31-14-generic是我的当前内核启动版本
3>编译好后会出现secbulk.ko文件 # ls
4># sudo insmod ./secbulk.ko --加载模块到Linux内核
注意:每次开机都要加载一次那个.ko模块,大家可以自己将它写到开机脚本里,省去了每次都要手动加载的麻烦!
# dmesg --查看是否加载成功
看到这样两行就说明成功了...
5># cd ../dnw# gcc -o dnw dnw.c --编译dnw工具
6># sudo cp dnw /usr/local/bi --将文件copy到/usr/local/bin目录
7>这样就可以在shell下面直接使用dnw命令了
8>在minicom的输出信息Enter your selection: n USB host is connected. Waiting a download.
9>此时,打开另一个终端:# sudo dnw 1.binlibing
@ubuntu:~$ sudo dnw 1.binfile
name : 1.binfile size : 1214004 bytesWriting data...100%
我安装之后出现下面的问题在shell界面进行下载时出现了can not open /dev/secbulk0
于是乎我通过百度得知是因为dev下没有对应设备文件secbulk0,解决办法:
1>#cd /mnt/hgfs/file/dnw_for_linux/secbulk/ --进入secbulk文件夹中,里面有一个secbulk.c的文件
2>#...vi secbulk.c
3> 查看里面的主设备号和次设备号是否和自己使用的产品一致
4>将开发板与PC 连好SD卡启动进入bootloarder如果是菜单模式随意选择一个下载指令如果是命令模式则输入dnw 050008000(地址随意),在linux命令行输入lsusb 这时会出现一串的usb设备,查看自己的设备进行相应的修改,上图中第一个是主设备号,第二个是次设备号
这里我lsusb后发现没有自己的设备,经自己和他人进行交流发现要在虚拟机中进行 虚拟机->可移动设备->进行串口与虚拟机的链接(这样就和主机断开了),然后进行lsusb后就可以看到自己的设备号了。。。我使用是2440,设备号是上图中的。
对于dnw_for_linux已经安装成功后,我们需要安装linux下的minicom进行串口通信:
1># sudo apt-get install minicom --安装minicom
2># sudo apt-get install lrzsz --安装lrzsz(在通过串口用xmodem协议烧写内核 时会提示没有xmodem协议,所以这时就要安装lrzsz软件包了)
3>这样就可以使用minicom进行通信了。
进行minicom的配置:
1># sudo minicom -s
2>选择Serial port setup
3>按下a键,修改/dev/ttyS0后回车 --选择UART0
4>按下e键,修改波特率115200 8N1
5>按下f键,将Hardware Flow Contro修改为NO,在刚才主菜单中选择Save setup as dfl,保存为默认配置,最后选择Exit from minicom,退出配置菜单
开发板与电脑进行串口线的连接后在minicom中使用命令 sudo minicom进入minicom界面就可以了。
这里我遇到的问题是:
(1)minicom配置好后出现can not open /dev/ttyusb0
--解决办法在虚拟机的可移动设备中将串口线选择“连接”,这样在/devx下就会出现ttyusb0
(2)minicom出现乱码
--暂时没有得到解决
我在网上寻找了已经解决的方法:
《1》换一根好的串口线
《2》升级minicom版本,然后通过 “-R”可以进行自动格式转换
起初我设置了一下编码格式,并没有改善,如果有朋友有这方面的解决经验,希望能够分享一下,在此谢谢了。