驱动的两种编译方法

静态编译

        就是直接把驱动放到内核中,成为内核中的一部分。把写好的驱动源代码(led.c文件)放到,内核的字符驱动中(路径为:linux-2.6.32.2/drivers/char ),然后修改下配置;

第一部分要修改的是:

        修改文件Kconfig(vim linux-2.6.32.2/drivers/char/Kconfig)

        往里面添加:

        config MY2440_LEDS
           tristate "Leds driver yzh"(在make  menuconfig时显示的驱动模块名称)

          depends on ARCH_S3C2440  (如果选择了这个配置,表示只有在s3c2440系统上才会出现这个选项)
          default y
           ---help---
               myLeds yuzhihui  

        修改上面一部分只是在make menuconfig时能够有相应的选项来给用户选择是否加载这个驱动模块;

    

        选择模块步骤(也就是编译内核步骤):

        make menuconfig(在这之前要把开发板内核对应的屏幕配置文件修改成.config文件,比如:cp config_mini2440_x35 .config)

       1、如果在Kconfig中添加配置时选择了depends on  ARCH_S3C2440,那么这里要先进入:system type --> 选择你依赖的平台。如果没有添加那句话,则这里可以省略;

       2、依次进入:Device Drivers  --->>  Character devices --->>   <*> Leds driver yzh (这时候就会有你上面添加的模块选项)

   

第二部分要修改的是:

        修改文件Makefile(vim linux-2.6.32.2/drivers/char/Makefile)

        往Makefile中添加句:obj-$(CONFIG_MY2440_LEDS)   += myLed.o;其中CONFIG_MY2440_LEDS是根据上面Kconfig中来的,myLed.o  则是根据你的源文件:myLed.c来的。


        当上面make menuconfig后可以到 .config中看看会有句:CONFIG_MY2440_LEDS=y ;表示已经选中了这个模块编译到内核中去了;


        当make menuconfig 顺利选择模块后,就开始编译内核了,命令:make zImage;

        最后到 /arch/arm/boot/中找到zImage就是编译后的内核了;


动态加载:

        直接在宿主机中用Makefile把驱动源代码编译成 .ko文件,然后通过nfs服务器拷贝到开发板中,直接用insmod加载进去就可以了。


测试:

        首先可以用命令:cat /proc/devices  来查看下已经加载的驱动,并且显示主设备号和次设备号

        接着在/dev下创建一个设备节点:mknod yzhChar c 250 0;mknod 表示创建的是设备节点;yzhChar 表示该设备文件的名称(当测试是用open打开该文件);c 表示是字符设备文件;250  表示是主设备号;0 表示是次设备号;

  

        如果测试程序就可以把/dev/yzhChar当作一个普通文件来读写操作。


        sscanf("123456","%s",buf);//此处buf是数组名,它的意思是将123456以%s的形式存入buf中!


        转载请注明作者和原文出处,原文地址: http://blog.csdn.net/yuzhihui_no1/article/details/45083415
        若有不正确之处,望大家指正,共同学习!谢谢!!!


你可能感兴趣的:(Linux驱动)