linux驱动开发之(一)---环境搭建

首先我的操作系统是Ubuntu

问题一:

http://www.linuxidc.com/Linux/2011-11/47481.htm

问题二:

我用得是USB 转串口, sudo minicom -s 把 /dev/tty8/ttyUSB0改成/dev/ttyUSB0save as dfl,直接输入minicom

 

显示minicom:cannot open /dev/tty8/ttyUSB0: 不是一个目录

 

 

sudo vim /etc/minirc.dfl后把 /dev/tty8/ttyUSB0改成/dev/ttyUSB0后 :wq, 出现同样的提示。

 

我怀疑是没有修改成功,再次 sudo vim /etc/minirc.dfl 查看的确修改过来了,用ls -l 查看minirc.dfl 对于root是可读写的。

 

就是很郁闷为什么会出现这样的问题!?

http://forum.ubuntu.org.cn/viewtopic.php?p=891039

问题三:

错误信息已经很清楚的告诉你 【404  Not Found】,意思是在这个“us”的【源】上找不到你需要下载的软件。

解决办法很简单,更换另一个源就行了。一般建议是使用国内的源。

更新管理器(update-manager),打开后按底下的“设置”->ubuntu软件”->“下载自”

在“下载自”那里点“其他站点”,里面选一个源就是了。一般选中国的源。

或者新立得(synaptic),打开后点菜单“设置”->“软件库”,然后是同样的设置。

或者是直接打开在命令行上打开:software-properties-gtk

或者直接编辑/etc/apt/sources.list,输入新的源。

 

问题四:

在 Ubuntu 系统中有两种设置环境变量 PATH 的方法。第一种适用于为单一用户设置 PATH,第二种是为全局设置 PATH。第三种方法适合于暂时修改,重新登录后失效

 

第一种方法:

 

在用户主目录下有一个 .bashrc 文件,可以在此文件中加入 PATH 的设置如下:

 

export PATH=$PATH:/your path1/:/your path2/..

 

注意:每一个 path 之间要用 “:“ 分隔。

 

注销重启 就可以了。

 

第二种方法:

 

在 /etc/profile中增加。

 

PATH="$PATH:/home/zhengb66/bin"

 

export PATH

 

第三种方法:

 

直接在终端下输入

 

export PATH="$PATH:/home/xjtu129/"

 

ok

 

因为文件要启动时加载,所以前两种需重启。

 

另外,要是不正确导致PATH设置错误,如export PATH=/sbin”,而没有顾及以前的内容导致最后,PATH只为sbin值,正确的添加方法为方法三,首先读出PATH,然后:加新值,再付给PATH自己!!!

 

一般PATH系统指令目录有六个搜索范围:

 

PATH="/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin:/bin:/sbin"。。

 

问题四:

找不到安装包

没有运行 sudo apt-get update或者你的源没有正确配置

 

问题五:ubuntu的软件源 --- 每次换源都要update一下

http://hi.baidu.com/wastorode/item/38a88efd6a97581ffe3582cb

 

问题六:mkyaffs2image问题

http://blog.csdn.net/bjutstar/article/details/7182089

 

问题七:mkyaffs2image的产生

Ubuntu中第一次使用mkyaffs2image命令时,会提示

 

mkyaffs2image:找不到命令

 

还需要安装mkyaffs2image

 

http://code.google.com/p/fatplus/downloads/detail?name=yaffs2-source.tar&can=2&q=

 

下载yaffs2-source.tar 

 

解压后,进入utils文件夹,然后make

 

make之后生成的mkyaffs2image文件拷贝到/usr/bin目录下

 

$ su

# cp mkyaffs2image /usr/bin/

# chmod 777 /usr/bin/mkyaffs2image

 

之后

 

$ mkyaffs2image 

mkyaffs2image: image building tool for YAFFS2 built Jan  6 2012

usage: mkyaffs2image dir image_file [convert]

           dir        the directory tree to be converted

           image_file the output file to hold the image

           'convert'  produce a big-endian image from a little-endian machine

 

表明安装成功,同时也可以看到该命令的用法

 

问题八:

minicom利用vivi选择烧写程序

http://hi.baidu.com/lmzzyw/item/cf99c71bfbcada613f87ce95

 

问题九:

http://wenku.baidu.com/view/276fe56858fafab069dc0272.html

关于使用ubuntu超级终端minicom传文件的问题(有选项可以选择的)

 

问题十:

方案一:DNW for Linux下的编译

http://blog.csdn.net/williamlinchen/article/details/6635789

方案二:直接下载DNW for Linux

http://blog.csdn.net/huanghui167/article/details/8174763

 

问题十一:

DNW for linux的使用,注意点,要在另外一个窗口中root权限下使用

http://www.crifan.com/solved_ubuntu__dnw_cannot_claim_interface_operation_not_permitted/

 

问题十二:

lrsz文件通信

http://www.cnblogs.com/bo1989/articles/2798918.html

http://blog.csdn.net/ypist/article/details/6610636 --- 好资料

在开发板上先进入/tmp 目录,然后输入lrz

            # cd /tmp

            # lrz                                                                         

            ?z waiting to receive.**B0100000023be50

            按Ctrl-A,再按s,选择zmoden,会出现一个选择文件的界面,选择你要传输的文件(按一下空格键选择目录,按两下空格键进入目录),回车后出现一个传输界面,传输完成后,便可以在开发板的/tmp目录下找到这个文件了。---太神奇了

 

问题十三:

linux环境下实现arm9的裸烧

http://blog.csdn.net/girlkoo/article/details/6878897

 

问题十四:

在本机上编译驱动程序,要先进行内核树的配置

O'REILLY 写的《LINUX 设备驱动程序》中作者一再强调在编写驱动程序时必须 建立内核树。所谓内核树,我的理解和网上资料说的一致就是内核源码的一种逻辑形式。

 

先查看自己OS使用的内核版本 

 

shana@shana:~$ uname -r 

2.6.22-14-generic /* 这是我显示的结果 */ 

 

如果安装系统时,自动安装了源码。在 /usr/src 目录下有对应的使用的版本目录。例如下(我是自己下的) 

 

shana@shana:/usr/src$ ls 

linux-headers-2.6.22-14 

linux-headers-2.6.22-14-generic 

linux-source-2.6.22 /*这个就是解压后的源码目录 */ 

linux-source-2.6.22.tar.bz2 /* 这是我下的源码 包 */ 

shana@shana:/usr/src$ 

 

如果没有源码。(一般ubuntu 都没有吧) 

查看一下可一下载的源码包(切记不要使用超级用户使用此命令否则……会提示没有此命令) 

 

shana@shana:/usr/src$ apt-cache search linux-source 

linux-source - Linux kernel source with Ubuntu patches 

xen-source-2.6.16 - Linux kernel source for version 2.6.17 with Ubuntu patches 

linux-source-2.6.22 - Linux kernel source for version 2.6.22 with Ubuntu patches 

shana@shana:/usr/src$ 

 

我选择了 linux-source-2.6.22 - Linux kernel source for version 2.6.22 with Ubuntu patches 这个~ 

然后 install 之 

 

shana@shana:/usr/src$ sudo apt-get install linux-source-2.6.22 

 

下载完成后,在/usr/src下,文件名为:linux-source-2.6.22.tar.bz2,是一个压缩包,解压缩既可以得到整个内核的源代码: 

 

注意 已经切换到超级用户模式 

 

root@shana:/usr/src#tar jxvf linux-source-2.6.20.tar.bz2 

 

解压后生成一个新的目录/usr/src/linux-source-2.6.22,所有的源代码都在该目录下。 

 

进入该目录 

 

开始配置内核 选择最快的原版的配置(默认)方式 (我是如此) 

 

root@shana:/usr/src/linux-source-2.6.22# make oldconfig 

 

当然你也可以使用 自己喜欢的配置方式 如 menuconfig , xconfig(必须有GTK环境吧)。反正不用剪裁什么,所以不管那种方式能配置它就行了。 

 

完成后,开始make 吧 这儿比较久 一般有1一个小时吧。(保证空间足够 我编译完成后 使用了1.8G) 我分区时分给/目录30G的空间,我没遇到这问题。倒是我朋友遇到了。 

 

shana@shana:/usr/src/linux-source-2.6.22$ make 

 

shana@shana:/usr/src/linux-source-2.6.22$ make bzImage 

 

当然,第一个make也可以不执行,直接make bzImage。执行结束后,可以看到在当前目录下生成了一个新的文件: vmlinux, 其属性为-rwxr-xr-x。 

 

然后 : 

 

root@shana:/usr/src/linux-source-2.6.22#make modules /* 编译 模块 */ 

 

root@shana:/usr/src/linux-source-2.6.22#make modules_install /* 安装 模块 */ 

 

执行结束之后,会在/lib/modules下生成新的目录/lib/modules/2.6.22-14-generic/ 

。 在随后的编译模块文件时,要用到这个路径下的build目录。至此,内核编译完成。可以重启一下系统。 

 

至此 内核树就建立啦 原来不是很难..... 

 

 

折腾了很长时间,总算是弄明白怎么在linux编译运行arm裸机程序了。编译运行arm裸机程序可以考虑用arm工具链搭建编译环境,由minicomdnw来下载程序,至于调试,还没有去耐心研究,着急来这里先备份一下,免得时间久了,忘记怎么回事。

 

首先是arm工具链,arm工具链的编译我就不写了,一方面很麻烦,另一方面是这方面的资料网上已经有很多了,我就不在这里多言浪费大家时间了。我这里有自己编译的arm工具链,当然,用网上现成的也不是不可以,但是最好是自己熟悉过程,免得必要的时候不会从源码配置。我将工具链上传到空间,如果需要,尽管拿去,链接地址为,使用说明看资源备注:

 

http://download.csdn.net/detail/girlkoo/3689485

 

这样,就可以开发普通的arm裸机程序了,现在开发环境是有了,编写可以编译通过的代码很是容易,但是编写真正运行正常的却不那么简单,因此,烧录工具还是必要的,我推荐是用minicomdnwminicom模拟与windows下的超级终端有相同的功能,这样就可以像windows下开发环境一样与vivi对话了,另外,我在网上下来多个dnwdnw2,但是发现dnw2在某些情况下不是很稳定,当然也有听说的成分,不管怎么说,就是个工具,不管哪个,用着顺手就行,我用的是dnw,也可能是我点背,下载的几个dnw烧录大的镜像可以,但是烧录自己开发的程序,只有二三百K的小文件却老是出错,还好linux下是开放源码的,于是我就修改了一番,当然,限于水平因素,可能曲解了原作者的意图,不过巧合的是烧录小文件正常了,大的文件也可以,或许你用的时候并没有这个问题,那么请您使用原版的dnw,指出小弟缺点,如果不幸弄巧成拙求诸位不要喷我,下面是我修改后的dnw源码及使用说明,下载地址是:

 

http://download.csdn.net/detail/girlkoo/3689525

 

配置好上面两个工具后就可以开发arm2440的裸机程序了,当然移植系统可能还会用到其他牛B的工具,等用到再去研究,如果有幸小弟弄明白了,还会来这里记录下来的,下面附上两个linux下的arm裸机程序及makefile,感觉对我这样的新手来说还是有帮助的。

 

例子1:汇编文件led_on.S,代码如下,这里我想告诉大家的是GNU的汇编跟标准的arm汇编是有出入的,具体的大家可以搜索“linux arm 汇编”来学习了解,网友给我们提供了足够丰富的资源。

 

[html] view plaincopy

 

    .text  

    .global _start  

    _start:  

        ldr r0,=0x56000010  

        ldr r1,=0x00155555  

        str r1,[r0]  

        ldr r0,=0x56000014  

        mov r1,#0x0  

        str r1,[r0]  

    MAIN_LOOP:  

        b MAIN_LOOP  

 

 

编译指令如下:

 

编译:arm-linux-gcc -g -c -o led_on.o led_on.S

 

链接:arm-linux-ld -Ttext 0x30000000 -g -o led_on.elf led_on.o

 

转换:arm-linux-objcopy -O binary -S led_on.elf led_on.bin

 

makefile可以这样写:

 

[html] view plaincopy

 

    led_on.bin:led_on.S  

        arm-linux-gcc -g -c -o led_on.o led_on.S  

        arm-linux-ld -Ttext 0x30000000 -g led_on.o -o led_on_elf  

        arm-linux-objcopy -O binary -S led_on_elf led_on.bin  

    clean:  

        rm -f led_on.bin led_on_elf *.o  

 

例子2:老师曾经跟我说arm必须用汇编引导启动,但是用C试了一下,发现没有汇编,一样能操作arm芯片,下面是让流水灯循环点亮的程序,

 

[html] view plaincopy

 

    #define GPBCON    (*(volatile unsigned *)0x56000010)  

    #define GPBDAT    (*(volatile unsigned *)0x56000014)  

    #define GPBUP     (*(volatile unsigned *)0x56000018)   

    #define MPLL100MHz      0x0007f022  

    #define CLKDIV2         0x02  

    #define rMPLLCON    (*(volatile unsigned *)0x4c000004)   

    #define rCLKDIVN    (*(volatile unsigned *)0x4c000014)   

    int main()  

    {  

        int i = 0;  

        int count = 0;  

        int LEDS[4] = {0x1c0, 0x1a0, 0x160, 0xe0};  

      

        rMPLLCON = MPLL100MHz;  

        rCLKDIVN = CLKDIV2;  

        GPBCON = 0x00155555;  

        GPBUP  = GPBUP & 0xFF00;  

      

        while(1)  

        {  

            for(count = 0; count != 4; ++ count)  

            {  

                GPBDAT=LEDS[count];  

                for(i = 0; i<0x30000;i++ );  

            }  

        }  

    }  

 

 

命令行下的编译流程我就不写了,直接把makefile贴在这里吧

 

[html] view plaincopy

 

    led.bin:led.c  

        arm-linux-gcc -g -c -o led.o led.c  

        arm-linux-ld -Ttext 0x30000000 -g led.o -o led.elf -e main  

        arm-linux-objcopy -O binary -S led.elf led.bin  

    .PYTHON:clean  

    clean:  

        rm *.o led.elf led.bin  

 

这里我想提醒一下,纯Cmakefile与汇编的makefile是有点区别的,由于C的主函数是main,但是arm执行环境并不知道是main,因此需要显式的指定arm入口函数-e main,其他的就没什么可说的了,多文件编译可以使用推导,我相信到这里大家都能自己编写多文件的makefile了,我就不多说了,如果有朋友对此有疑问可以联系qq630905224,我想大家一块讨论,共同进步还是好的,好了,浪费大家时间了。 

 

 

首先在这里对文档中涉及到的网址文章作者表示感谢,几个月前弄的配置,过程中在作者那里我学到了很多。

可能大家在配置的过程中遇到的问题跟我所遇到的有所不同,但是请相信我提供的这些网址都是不错的一些方法,应该可以对大家有些帮助。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值