• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

linux操作系统的arm驱动开发

武飞扬头像
g323830
帮助1

故名思义:linux操作系统之上的开发

大概思路为:在板子上安装好linux操作系统(板子被linux所保护),一切操作都需要通过linux来运行,若需要添加驱动,就需要把驱动通过linux官方给的添加驱动格式来添加(任何非官方的添加方式会失败),下文为linux添加驱动流程

1在ubuntu写入好程序-----------

以下为vi module.c的标准代码格式

  1.  
    #include <linux/init.h>
  2.  
    #include <linux/module.h>
  3.  
    #include <linux/kernel.h>
  4.  
    #include <linux/version.h>
  5.  
    #include <asm/io.h>
  6.  
     
  7.  
    MODULE_AUTHOR("xxx");
  8.  
    MODULE_LICENSE("Dual BSD/GPL");
  9.  
    MODULE_DESCRIPTION("for module test");
  10.  
     
  11.  
    static int mymodule_init(void)
  12.  
    {
  13.  
     
  14.  
    printk("module install-axxxxxxxxxxxxxxxx--------------------------\n");
  15.  
    return 0;
  16.  
    }
  17.  
     
  18.  
    static void mymodule_exit(void)
  19.  
    {
  20.  
    printk("module release--------------------------------\n");
  21.  
    }
  22.  
     
  23.  
    module_init(mymodule_init);
  24.  
    module_exit(mymodule_exit);
学新通

写入想生成的驱动程序为:

  1.  
    #include <linux/init.h>
  2.  
    #include <linux/module.h>
  3.  
    #include <linux/kernel.h>
  4.  
    #include <linux/version.h>
  5.  
    #include <asm/io.h>
  6.  
     
  7.  
    MODULE_AUTHOR("xxx");
  8.  
    MODULE_LICENSE("Dual BSD/GPL");
  9.  
    MODULE_DESCRIPTION("for module test");
  10.  
     
  11.  
    //your code!!!!!
  12.  
     
  13.  
    void led_init(void)
  14.  
    {
  15.  
    int *gpx2con = ioremap(0x11000c40, 4);
  16.  
    *gpx2con = 1<<28;
  17.  
    }
  18.  
     
  19.  
    void led_on(void)
  20.  
    {
  21.  
    int *gpx2dat = ioremap(0x11000c44, 4);
  22.  
    *gpx2dat |= 1<<7;
  23.  
    }
  24.  
     
  25.  
    void led_off(void)
  26.  
    {
  27.  
    int *gpx2dat = ioremap(0x11000c44, 4);
  28.  
    *gpx2dat &= ~(1<<7);
  29.  
    }
  30.  
     
  31.  
    static int mymodule_init(void)
  32.  
    {
  33.  
    led_init();
  34.  
    led_on();
  35.  
     
  36.  
    printk("module install-axxxxxxxxxxxxxxxx--------------------------\n");
  37.  
    return 0;
  38.  
    }
  39.  
     
  40.  
    static void mymodule_exit(void)
  41.  
    {
  42.  
    led_off();
  43.  
    printk("module release--------------------------------\n");
  44.  
    }
  45.  
     
  46.  
    module_init(mymodule_init);
  47.  
    module_exit(mymodule_exit);
学新通

2通过make将源代码程序编写出来,编写出来生成了一个module.ko文件-------------->

make的源代码:

学新通

3将这个文件通过smv或scp module.ko 192.168.12.152(板子所在ip):/发送到板子上面,就可以完成了ko文件的远程发送

发送完毕后再板子中

插入驱动Insmod module.ko就可以看到led灯亮的效果了

拔出驱动rmmod module     就可以看到led灯灭的效果了

另外,这是站在底层所开启关闭驱动的效果,无法达到从应用层来开启关闭驱动

就要引入另外一个概念:

linux的所有驱动由一张哈希表所找到他们的地址,他们的地址都由数字所代表(例如50,1),分成俩部分数字,前方数字为主设备号(一般为0-255),后方数字为次设备号,

而这对于人来说很难记得那么多数字,就需要用一个自定义字符串去代表这些数字;

故分成底层和应用层俩部分:
底层部分:1)在底层去向linux申请新驱动的号码;2)编写并打包好驱动的程序;3)将驱动程序塞进号码里

应用层部分:1)将号码记住 ;2)将底层号码与字符串绑定 mknod c  led1 255 0(mknod:指令 c:所在哈希表 led1 :驱动名  255);3)通过系统调用(io接口)操作驱动文件

但这还不及控制驱动的效果,这只是驱动的初始化中添加了功能而已

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgjacjc
系列文章
更多 icon
同类精品
更多 icon
继续加载