查看: 5045|回复: 3

在BananaPi上编写驱动程序

[复制链接]
  • TA的每日心情
    擦汗
    2018-3-3 15:21
  • 签到天数: 222 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2014-10-10 23:16:53 | 显示全部楼层 |阅读模式
    分享到:
    网上有关linux驱动编写的文章很多,各种视频也是一大把,随便一下好多个G,让人起来头大。
    通常Linux驱动开发,一种是普通的linux平台下的驱动,另外一种就是嵌入式linux驱动开发。
    对于我们的香蕉派,当然是后一种了。说到嵌入式linux驱动开发,首先需要提及的是交叉编译。所谓交叉编译,百度一下载录如下:
    在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码,而这工具就交叉编译器(cross compiler)
    为什么需要交叉编译环境呢?是利用性能强大的计算机环境来编译另外一种功能专一的环境下运行的代码。熟悉ARM7或者Cortex M系列MCU的朋友大都知道IAR或者Keil,其实他们就是一种交叉编译开发工具——在PC上编写代码,编译后下载到MCU中运行。
    但是嵌入式Linux的交叉编译环境搭建起来相对复杂,不是仅仅双击程序进行安装,下一步,下一步,就可以完成的。事实上搭建交叉编译环境的交叉也是一搜一大把,而且都是洋洋洒洒上千字这里就不在重复转述了。而且就是按照其操作一遍都是一件很痛苦的事情。通常我们都是在虚拟机里面安装ubuntu,操作起来相对比较慢,在学着配置交叉编译……头大啦
    事实上BananaPi的性能比较强大,而且仅仅利用它学习驱动程序的编写,所以直接利用自身的环境进行编译——怎么简单怎么来,怎么上手快怎么来——初学者嘛(先给自己留个后路)
    我使用的是树莓派的系统,发现编译器已经集成,版本不是最新的,但是不影响使用
    pi@bananapi:~$ gcc -v
    Using built-in specs.
    COLLECT_GCC=gcc
    COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.6/lto-wrapper
    Target: arm-linux-gnueabihf
    Configured with: ../src/configure -v --with-pkgversion='Debian 4.6.3-14+rpi1' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-sjlj-exceptions --with-arch=armv6 --with-fpu=vfp --with-float=hard --enable-checking=release --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
    Thread model: posix
    gcc version 4.6.3 (Debian 4.6.3-14+rpi1)
    pi@bananapi:~$ make -v
    GNU Make 3.81
    Copyright (C) 2006  Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.
    There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
    PARTICULAR PURPOSE.

    This program built for arm-unknown-linux-gnueabihf


    在这里我们可以找到相应的内核 https://github.com/LeMaker
    下载地址为:https://github.com/LeMaker/linux-bananapi/archive/bananapi-3.4.zip
    这里需要用到的命令为tar和ln
    这里顺便载录一点有关tar和ln命令的详解
    ————————————————————————————
    tar压缩解压缩命令详解
    tar命令详解
    -c: 建立压缩档案
    -x:解压
    -t:查看内容
    -r:向压缩归档文件末尾追加文件
    -u:更新原压缩包中的文件
    这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。
    下面的参数是根据需要在压缩或解压档案时可选的。
    -z:有gzip属性的
    -j:有bz2属性的
    -Z:有compress属性的
    -v:显示所有过程
    -O:将文件解开到标准输出
    参数-f是必须的
    -f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。
    # tar -cf all.tar *.jpg 这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名。
    # tar -rf all.tar *.gif 这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。
    # tar -uf all.tar logo.gif 这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。
    # tar -tf all.tar 这条命令是列出all.tar包中所有文件,-t是列出文件的意思
    # tar -xf all.tar 这条命令是解出all.tar包中所有文件,-x是解开的意思
    查看
    tar -tf aaa.tar.gz   在不解压的情况下查看压缩包的内容
    压缩
    tar –cvf jpg.tar *.jpg //将目录里所有jpg文件打包成tar.jpg
    tar –czf jpg.tar.gz *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压缩过的包,命名为jpg.tar.gz
    tar –cjf jpg.tar.bz2 *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用bzip2压缩,生成一个bzip2压缩过的包,命名为jpg.tar.bz2
    tar –cZf jpg.tar.Z *.jpg   //将目录里所有jpg文件打包成jpg.tar后,并且将其用compress压缩,生成一个umcompress压缩过的包,命名为jpg.tar.Z
    解压
    tar –xvf file.tar //解压 tar包
    tar -xzvf file.tar.gz //解压tar.gz
    tar -xjvf file.tar.bz2   //解压 tar.bz2tar –xZvf file.tar.Z //解压tar.Z
    总结
    1、*.tar 用 tar –xvf 解压
    2、*.gz 用 gzip -d或者gunzip 解压
    3、*.tar.gz和*.tgz 用 tar –xzf 解压
    4、*.bz2 用 bzip2 -d或者用bunzip2 解压
    5、*.tar.bz2用tar –xjf 解压
    6、*.Z 用 uncompress 解压
    7、*.tar.Z 用tar –xZf 解压

    ————————————————————————————

    [size=14.399999618530273px]ln命令用来给档案创建链接。

    [size=14.399999618530273px]1. 使用ln命令给档案创建symbolic link。
    linux系统下的symbolic link类似于windows系统的快捷方式一样。
    使用ls命令查看,可以看到新创建的symbolic link有独立的inode,
    也就是symbolic link会占用一个inode,但是其实际内容仍然是指向
    源文件所指向的block区域。
    # touch /tmp/file
    # ls -lhi /tmp/file
       3441 -rw-r--r--    1 root     root            0 Jan  1 00:09 /tmp/file
    #
    # ln -fs /tmp/file /tmp/symbolic_link
    # ls -lhi /tmp/symbolic_link
       3647 lrwxrwxrwx    1 root     root            9 Jan  1 00:10 /tmp/symbolic_link -> /tmp/file
    #

    [size=14.399999618530273px]2. 删除symbolic link文件,实际上就是删除这个inode,而不会影响到源文件所指向的block区域;
    而如果删除了源文件,那这个symbolic link文件就基本上没用了。
    # echo "link test" > /tmp/file
    # cat /tmp/file
    link test
    #
    # rm /tmp/symbolic_link
    # cat /tmp/file
    link test
    #
    # ln -fs /tmp/file /tmp/symbolic_link
    #
    # rm /tmp/file
    # cat /tmp/symbolic_link
    cat: can't open '/tmp/symbolic_link': No such file or directory
    #
    # ls -lhi /tmp/symbolic_link
       7357 lrwxrwxrwx    1 root     root            9 Jan  1 00:22 /tmp/symbolic_link -> /tmp/file
    #

    [size=14.399999618530273px]3. 使用ln命令创建hard link。
    可以看到,创建hard link是使用同一个inode,而copy了一份源文件的block区域出来。
    如果修改档案的内容,源文件和hard link文件对应的block区域内容都会被修改,从而保持一致性。
    # touch /tmp/file
    # echo "hard link test" > /tmp/file
    # cat /tmp/file
    hard link test
    # ln /tmp/file /tmp/hard_link
    # ls -lhi /tmp/file
       7996 -rw-r--r--    2 root     root           15 Jan  1 00:25 /tmp/file
    # ls -lhi /tmp/hard_link
       7996 -rw-r--r--    2 root     root           15 Jan  1 00:25 /tmp/hard_link
    # cat /tmp/hard_link
    hard link test
    #
    # echo "hard link test 2" > /tmp/file
    # cat /tmp/file
    hard link test 2
    # cat /tmp/hard_link
    hard link test 2
    #
    # echo "hard link test 3" > /tmp/hard_link
    # cat /tmp/file
    hard link test 3
    # cat /tmp/hard_link
    hard link test 3
    #

    [size=14.399999618530273px]4. 删除hard link或者删除源文件,实际上只是删除其中其中一份block区域。
    可以看到,虽然源文件被删除(实际上只是删除了源文件对应的block区),但是
    inode仍然还在,所以仍然可以透过hard link档案来访问源文件的内容。
    到了这里,就可以理解为什么inode信息中不包含文件名了;
    因为如果文件名信息包含在inode中,并且创建了hard link,此时为何还需要两块不同的block区域
    来储存文件信息呢?进而hard link还有什么意义呢?
    # rm /tmp/file
    # cat /tmp/file
    cat: can't open '/tmp/file': No such file or directory
    #
    # cat /tmp/hard_link
    hard link test 3
    #
    # ls -hli /tmp/hard_link
       7996 -rw-r--r--    1 root     root           17 Jan  1 00:29 /tmp/hard_link
    #

    [size=14.399999618530273px]5. 为目录创建symbolic link?
    因为新建的symbolic link目录与源目录是同一个inode,所以对这两个目录的访问具有完全相同的表现。
    # mkdir /tmp/directory
    # ln -fs /tmp/directory/ /tmp/dir_sym_link
    #
    # ls -hdi /tmp/directory/
      14018 /tmp/directory/
    # ls -hdi /tmp/dir_sym_link/
      14018 /tmp/dir_sym_link/
    #
    # touch /tmp/directory/file
    # ls -hil /tmp/directory/file
      14781 -rw-r--r--    1 root     root            0 Jan  1 00:47 /tmp/directory/file
    # ls -hil /tmp/dir_sym_link/file
      14781 -rw-r--r--    1 root     root            0 Jan  1 00:47 /tmp/dir_sym_link/file
    #
    # echo "directory symbolic test" > /tmp/dir_sym_link/file
    # cat /tmp/dir_sym_link/file
    directory symbolic test
    # cat /tmp/directory/file
    directory symbolic test
    #

    [size=14.399999618530273px]6. 为目录创建hard link?
    从结果看,为目录创建hard link失败了。
    # ln /tmp/directory/ /tmp/dir_hard_link
    ln: /tmp/dir_hard_link: Operation not permitted


    tar.PNG
    connect.PNG
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2014-5-20 10:01
  • 签到天数: 41 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2014-10-11 09:05:06 | 显示全部楼层
    新手,不明觉厉!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2015-8-25 10:41
  • 签到天数: 66 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2014-10-11 09:14:23 | 显示全部楼层
    表示有点看不懂
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2015-10-8 09:49
  • 签到天数: 430 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2014-10-11 09:43:51 | 显示全部楼层
    好吧,楼主是告诉我们香蕉派里已经自带gcc编译器了
    期待楼主自己动手写个驱动出来分享一下
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-15 20:59 , Processed in 0.155138 second(s), 22 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.