精华内容
下载资源
问答
  • 4.编写hello_world驱动 驱动文件hello_mod.c示例: # include < linux/init.h> # include < linux/module.h> MODULE_LICENSE( "GPL" ); static int hello_init( void ) { printk(KERN_...

    0.准备条件

    操作系统:VMware虚拟机中运行的Debian 9
    采用的内核:linux4.9

    1.下载linux源代码

    debian或ubuntu下,使用apt工具下载linux源码(或只下载头文件也可以)
    centos使用yum

    su
    apt-get install -y linux-source

    安装完成后应当能够在/usr/src中看到如下3个文件或文件夹:

    dts@debian:~$ ls /usr/src/
    linux-config-4.9 linux-patch-4.9-rt.patch.xz linux-source-4.9.tar.xz

    2.将代码编译源代码

    先解压源码包,并将合适的配置文件复制到源码文件夹下并重命名为.config

    tar -xvf linux-source-4.9.tar.xz
    xz -d linux-config-4.9/config.amd64_none_amd64.xz
    mv linux-config-4.9/config.amd64_none_amd64 linux-source-4.9/.config

    编译一遍源码,以确定没有问题。(至少要编译scripts运行脚本)

    cd linux-source-4.9
    make -j4

    cd linux-source-4.9
    make scripts/

    3.了解Linux驱动相关命令和头文件

    (1) 命令

    #用于安装或删除一个模块 insmod rmmod

    (2)obj-m makefile 符号, 内核建立系统用来决定当前目录下的哪个模块应当被建立

    (3) linux/init.h

    //用于指定模块的初始化和清理函数的宏定义. module_init(init_function); module_exit(cleanup_function);(3)struct task_struct *current

    (4)linux/module.h

    模块相关宏定义的头文件

    (5)关于模块信息的常用宏

    MODULE_AUTHOR(author); MODULE_DESCRIPTION(description); MODULE_VERSION(version_string); MODULE_DEVICE_TABLE(table_info); MODULE_ALIAS(alternate_name);

    (6)int printk(const char * fmt, );//将字符串输出到内核调试信息

    4.编写hello_world驱动

    驱动文件hello_mod.c示例:

    #include&lt;linux/init.h&gt;
     #include&lt;linux/module.h&gt;
    MODULE_LICENSE("GPL");
    
    static int hello_init(void)
    {
        printk(KERN_ALERT "Hello,world\n");
        return 0;
    }
    
    static void hello_exit(void)
    {
        printk(KERN_ALERT "Goodbye,world\n");
    }
    
    module_init(hello_init);
    module_exit(hello_exit);
    

    对应的makefile示例:

    obj-m := hello_mod.o
    
    KERNEL_DIR := /usr/src/linux-source-4.9
    PWD := $(shell pwd)
    
    all:
        make -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules
    clean:
        rm *.o *.ko
    
    .PHONY:clean

    5.编译(在makefile和hello.c)

    root@debian:/home/dts/公共# make
    make -C /usr/src/linux-source-4.9 SUBDIRS=/home/dts/公共 modules
    make[1]: Entering directory '/usr/src/linux-source-4.9'
    
      WARNING: Symbol version dump ./Module.symvers
               is missing; modules will have no dependencies and modversions.
    
      CC [M]  /home/dts/公共/hello_mod.o
      Building modules, stage 2.
      MODPOST 1 modules
      LD [M]  /home/dts/公共/hello_mod.ko
    make[1]: Leaving directory '/usr/src/linux-source-4.9'

    6.安装和卸载

    安装模块hello_mod
    insmod hello_mod.ko
    卸载模块
    rmmod hello_mod

    7.在内核调试信息中查看安装和卸载hello_mod时输出的调试信息

    使用dmesg查看内核调试信息,可以发现末尾是hello_mod安装和卸载时的输出信息
    ╰─$ dmesg | tail
    [17961.689403] cfg80211: (5170000 KHz - 5250000 KHz @ 80000 KHz, 160000 KHz AUTO), (N/A, 2300 mBm), (N/A)
    [17961.689406] cfg80211: (5250000 KHz - 5330000 KHz @ 80000 KHz, 160000 KHz AUTO), (N/A, 2300 mBm), (0 s)
    [17961.689408] cfg80211: (5735000 KHz - 5835000 KHz @ 80000 KHz), (N/A, 3000 mBm), (N/A)
    [17961.689411] cfg80211: (57240000 KHz - 59400000 KHz @ 2160000 KHz), (N/A, 2800 mBm), (N/A)
    [17961.689413] cfg80211: (59400000 KHz - 63720000 KHz @ 2160000 KHz), (N/A, 4400 mBm), (N/A)
    [17961.689415] cfg80211: (63720000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 2800 mBm), (N/A)
    [17961.835073] userif-2: sent link down event.
    [17961.835078] userif-2: sent link up event.
    [18024.538743] Hello,world
    [18030.683052] Goodbye,world

     

    提示:

    1.编译时如果觉得在虚拟机中编译慢,可以多开几个核。开始只给了虚拟机一个核,结果编译的时候死机了…

    2.insmod: ERROR: could not insert module hello_mod.ko: Invalid module format 出现该错误时,请检查当前系统内核和使用的源码是否为一个版本。

    3.Makefile:671: scripts/Makefile.gcc-plugins: 没有那个文件或目录 编译时出现该类错误,请在源码目录下执行make scripts/

    展开全文
  • 操作系统课程设计选题 驱动程序编写和安装。  经过一天多的努力,终于把我的第一个驱动程序模块成功编写并实现插入内核和移除,在这里把过程记录下来方便以后查看,也给其他为之困扰的朋友一个建议。  环境: ...

    操作系统课程设计选题  驱动程序的编写和安装。

      经过一天多的努力,终于把我的第一个驱动程序模块成功编写并实现插入内核和移除,在这里把过程记录下来方便以后查看,也给其他为之困扰的朋友一个建议。

      环境:  windows 7 下 VMware 9.0 中装  Ubuntu12.04 内核版本为3.5.0-32-generic

       搭建驱动开发环境:

      相应版本的 gcc、gdb、make 。 内核源代码树。在Ubuntu 下内核源代码一般存放在  /usr/src/ 下。 我的Ubuntu /usr/src/下有两个文件夹  linux-headers-3.5.0-23 , linux-header-3.5.0-23-general 。从名字看这两个文件夹中的东西应该不是系统全部的源代码,打开看里面的东西也很少,一开始我以为这不是系统的全部源代码,没法使用。所以就到www.kernel.org上下载了linux-3.5的内核源代码,(为什么下载Linux3.5 而不是 3.5.0 ,因为网站上没找到)并编译配置。

      编写hello world 模块

      #include "linux/init.h"

      #include "linux/module.h"

      MODULE_LICENSE("Dual BSD/GPL");

      static int hello_init(void){

        printk(KERN_ALERT "hello , world !");

        return 0;

      }

      static void hello_exit(void){

        printk(KERN_ALERT "goodbye , cruel world \n");

      }

      module_init(hello_init);

      module_exit(hello_exit);

     

      然后写GNU扩展的Makefile,为了简单Makefile文件中只写了一行  

      obj-m := hello.o

      编译:

      在命令行下:

      make -C /usr/src/linux-header-3.5.0-23-general M=/root/Desktop modules

      各个参数的意义 : -C 后面的是与当前运行的内核版本相同的内核源代码树目录。 M后面的是内核代码和Makefile所在的文件夹 。 modules 表示编译的目标文件,是必须的。 编译完成后会在当前目录下生成一个hello.ko 模块文件。

      插入到内核模块:

      insmod hello.ko (执行这一步时系统会输出上面定义的hello_init()函数中的内容)

      移除模块:

      rmmod hello.ko(执行这一条语句时系统会输出上面定义的hello_exit()函数中的内容)

     

    可能出现的错误:

      1. printk(KERN_ALERT "goodbye , cruel world \n");

      注意这一串大写字符代表的是优先权的设定,后面不能有逗号。否者会出现 参数过多的错误。

      2. -C 后面的参数所指定的目录一定是与当前运行系统内核版本相同的内核源代码树所在目录。我一开始用的是我下载的Linux-3.5 的内核源代码树,结果卡了老半天都是 insmod: error inserting 'hello.ko': -1 Invalid module format。的错误。最后我把这个目录改成 /usr/src/linux-header-3.5.0-23-general 就行了。这个目录是安装系统时就有的。

     

    下面截个图秀一下:

    有很多的东西我也没搞明白,正在努力学习中~~~~~

      

    转载于:https://www.cnblogs.com/caiyao/p/3825671.html

    展开全文
  • 请根据学习目录进行学习:android平台硬件驱动原理学习(总) 一、为了方便开发,我们可以在IDE环境下使用Android SDK来开发Android应用程序。开发完成后,再把程序源代码移植到Android源代码工程目录中。使用...

    请根据学习目录进行学习:android平台硬件驱动原理学习(总)

    一、为了方便开发,我们可以在IDE环境下使用Android SDK来开发Android应用程序。开发完成后,再把程序源代码移植到Android源代码工程目录中。使用Eclipse的Android插件ADT创建Android工程很方便,这里不述,可以参考网上其它资料。工程名称为Hello,下面主例出主要文件:

        主程序是com/example/administrator/hello。Hello.java:

    [java] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. package com.example.administrator.hello;  
    2.   
    3. import shy.luo.hello.R;  
    4. import android.app.Activity;  
    5. import android.os.ServiceManager;  
    6. import android.os.Bundle;  
    7. import android.os.IHelloService;  
    8. import android.os.RemoteException;  
    9. import android.util.Log;  
    10. import android.view.View;  
    11. import android.view.View.OnClickListener;  
    12. import android.widget.Button;  
    13. import android.widget.EditText;  
    14.   
    15. public class Hello extends Activity implements OnClickListener {  
    16.     private final static String LOG_TAG = "shy.luo.renju.Hello";  
    17.       
    18.     private IHelloService helloService = null;  
    19.   
    20.     private EditText valueText = null;  
    21.     private Button readButton = null;  
    22.     private Button writeButton = null;  
    23.     private Button clearButton = null;  
    24.       
    25.     /** Called when the activity is first created. */  
    26.     @Override  
    27.     public void onCreate(Bundle savedInstanceState) {  
    28.         super.onCreate(savedInstanceState);  
    29.         setContentView(R.layout.main);  
    30.   
    31.     helloService = IHelloService.Stub.asInterface(  
    32.         ServiceManager.getService("hello"));  
    33.           
    34.         valueText = (EditText)findViewById(R.id.edit_value);  
    35.         readButton = (Button)findViewById(R.id.button_read);  
    36.         writeButton = (Button)findViewById(R.id.button_write);  
    37.         clearButton = (Button)findViewById(R.id.button_clear);  
    38.   
    39.     readButton.setOnClickListener(this);  
    40.     writeButton.setOnClickListener(this);  
    41.     clearButton.setOnClickListener(this);  
    42.           
    43.         Log.i(LOG_TAG, "Hello Activity Created");  
    44.     }  
    45.       
    46.     @Override  
    47.     public void onClick(View v) {  
    48.         if(v.equals(readButton)) {  
    49.         try {  
    50.                 int val = helloService.getVal();  
    51.                 String text = String.valueOf(val);  
    52.                 valueText.setText(text);  
    53.         } catch (RemoteException e) {  
    54.             Log.e(LOG_TAG, "Remote Exception while reading value from device.");  
    55.         }         
    56.         }  
    57.         else if(v.equals(writeButton)) {  
    58.         try {  
    59.                 String text = valueText.getText().toString();  
    60.                 int val = Integer.parseInt(text);  
    61.             helloService.setVal(val);  
    62.         } catch (RemoteException e) {  
    63.             Log.e(LOG_TAG, "Remote Exception while writing value to device.");  
    64.         }  
    65.         }  
    66.         else if(v.equals(clearButton)) {  
    67.             String text = "";  
    68.             valueText.setText(text);  
    69.         }  
    70.     }  
    71. }  
        程序通过ServiceManager.getService("hello")来获得HelloService,接着通过IHelloService.Stub.asInterface函数转换为IHelloService接口。其中,服务名字“hello”是系统启动时加载HelloService时指定的,而IHelloService接口定义在android.os.IHelloService中,具体可以参考在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务一文。这个程序提供了简单的读定自定义硬件有寄存器val的值的功能,通过IHelloService.getVal和IHelloService.setVal两个接口实现。

    界面布局文件res/layout/main.xml:
    [html] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. <?xml version="1.0" encoding="utf-8"?>  
    2.     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.        android:orientation="vertical"  
    4.        android:layout_width="fill_parent"  
    5.        android:layout_height="fill_parent">  
    6.        <LinearLayout  
    7.           android:layout_width="fill_parent"  
    8.           android:layout_height="wrap_content"  
    9.           android:orientation="vertical"   
    10.           android:gravity="center">  
    11.           <TextView   
    12.              android:layout_width="wrap_content"  
    13.              android:layout_height="wrap_content"   
    14.              android:text="@string/value">  
    15.           </TextView>  
    16.           <EditText   
    17.              android:layout_width="fill_parent"  
    18.              android:layout_height="wrap_content"   
    19.              android:id="@+id/edit_value"  
    20.              android:hint="@string/hint">  
    21.           </EditText>  
    22.        </LinearLayout>  
    23.        <LinearLayout  
    24.           android:layout_width="fill_parent"  
    25.           android:layout_height="wrap_content"  
    26.           android:orientation="horizontal"   
    27.           android:gravity="center">  
    28.           <Button   
    29.              android:id="@+id/button_read"  
    30.              android:layout_width="wrap_content"  
    31.              android:layout_height="wrap_content"  
    32.              android:text="@string/read">  
    33.           </Button>  
    34.           <Button   
    35.              android:id="@+id/button_write"  
    36.              android:layout_width="wrap_content"  
    37.              android:layout_height="wrap_content"  
    38.              android:text="@string/write">  
    39.           </Button>  
    40.           <Button   
    41.              android:id="@+id/button_clear"  
    42.              android:layout_width="wrap_content"  
    43.              android:layout_height="wrap_content"  
    44.              android:text="@string/clear">  
    45.           </Button>  
    46.        </LinearLayout>  
    47.     </LinearLayout>  
    字符串文件res/values/strings.xml:
    [html] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. <?xml version="1.0" encoding="utf-8"?>  
    2.     <resources>  
    3.        <string name="app_name">Hello</string>  
    4.        <string name="value">Value</string>  
    5.        <string name="hint">Please input a value...</string>  
    6.        <string name="read">Read</string>  
    7.        <string name="write">Write</string>  
    8.        <string name="clear">Clear</string>  
    9.     </resources>  
    程序描述文件AndroidManifest.xml:
    [html] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. <?xml version="1.0" encoding="utf-8"?>  
    2.     <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
    3.       package="com.example.administrator.hello"  
    4.       android:versionCode="1"  
    5.       android:versionName="1.0">  
    6.       <application android:icon="@drawable/icon" android:label="@string/app_name">  
    7.         <activity android:name=".Hello"  
    8.                   android:label="@string/app_name">  
    9.             <intent-filter>  
    10.                 <action android:name="android.intent.action.MAIN" />  
    11.                 <category android:name="android.intent.category.LAUNCHER" />  
    12.             </intent-filter>  
    13.         </activity>  
    14.       </application>  
    15.     </manifest>   
    三. 将Hello目录拷贝至packages/experimental目录,新增Android.mk文件:
        USER-NAME@MACHINE-NAME:~/Android/packages/experimental$ vi Android.mk
    Android.mk的文件内容如下:
    LOCAL_PATH:= $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE_TAGS := optional
    LOCAL_SRC_FILES := $(call all-subdir-java-files)
    LOCAL_PACKAGE_NAME := Hello
    include $(BUILD_PACKAGE)
    四. 编译:
    USER-NAME@MACHINE-NAME:~/Android$ mmm packages/experimental/Hello
    编译成功后,便可以在out/target/product/generic/system/app目录下看到Hello.apk文件了。
        五. 重新打包系统镜像文件system.img:
    USER-NAME@MACHINE-NAME:~/Android$ make snod
        重新打包后的system.img文件就内置了Hello.apk文件了。

    展开全文
  • linux驱动入门-hello设备驱动程序编写

    千次阅读 2016-07-31 11:54:19
    linux驱动入门-hello设备驱动程序编写 创建一个hello.c文件 [luxibao@centos ~]$ mkdir hello [luxibao@centos ~]$ ls dropbear-0.53.1 fl2440 公共的 视频 文档 音乐 dropbear-0.53.1.tar.bz2 hello 模板 图片...

    linux驱动入门-hello设备驱动程序编写

    创建一个hello.c文件

    [luxibao@centos ~]$ mkdir hello

    [luxibao@centos ~]$ ls

    dropbear-0.53.1          fl2440  公共的  视频  文档  音乐

    dropbear-0.53.1.tar.bz2  hello   模板    图片  下载  桌面

    [luxibao@centos ~]$ cd hello/

    [luxibao@centos hello]$ ls

    [luxibao@centos hello]$ vim hello.c

     

     

     

    /******************************************************************************

     

    }

    MODULE_LICENSE("Dual BSD/GPL");

     *      Copyright: (C) 2016 luxibao<864809344@qq.com>

     *              All rights reserved.

     *

     *      Filename: hello.c

     *      Description: This file

     *

     *      Version: 1.0.0(2016年07月26日)

     *      Author: luxibao <864809344@qq.com>

     *      ChangeLog: 1, Release initial version on "2016年7月26日10时8分00秒"

     *

     *

     *******************************************************************************/

     

    #include <linux/init.h>

    #include <linux/module.h>

    MODULE_LICENSE("Dual BSD/GPL");

     

     

    static int hello_init(void)

    {

            printk(KERN_ALERT "Hello, luxibao\n");

            return 0;

    }

     

     

     

    static void hello_exit(void)

    {

            printk(KERN_ALERT "Goodbye, luxibao\n");

    }

     

     

    module_init(hello_init);

    module_exit(hello_exit);

     

    这个模块定义了两个函数,其中一个在模块被装载打到内核是调用(hello——init),而另一个则是在模块被移除时调用(hello_exit)。

    特殊宏(MODULE_LICENSE)用来告诉内核,该模块采取自由许可证,如果没有这样的声明,内核在装载该模块时会产生抱怨。

    [luxibao@centos hello]$ ls

    hello.c

    Hello 驱动的Makefile编写:

    适用于Linux操作系统:

    hello.c同一级目录下创建makefile

    [luxibao@centos hello]$ vim makefile

     

    obj-m=hello.o

    modules:

            make -C /lib/modules/`uname -r`/build/ M=`pwd` modules

            make clean

     

    clean:

            rm -f *.o *.mod.c *.order *.symvers

     

    [luxibao@centos hello]$ ls

    hello.c  makefile

    [luxibao@centos hello]$ make

    [luxibao@centos hello]$ make

    make -C /lib/modules/`uname -r`/build/ M=`pwd` modules

    make[1]: Entering directory `/usr/src/kernels/2.6.32-573.el6.x86_64'

      CC [M]  /home/luxibao/hello/hello.o

      Building modules, stage 2.

      MODPOST 1 modules

      CC      /home/luxibao/hello/hello.mod.o

      LD [M]  /home/luxibao/hello/hello.ko.unsigned

      NO SIGN [M] /home/luxibao/hello/hello.ko

    make[1]: Leaving directory `/usr/src/kernels/2.6.32-573.el6.x86_64'

    make clean

    make[1]: Entering directory `/home/luxibao/hello'

    rm -f *.o *.mod.c *.order *.symvers

    make[1]: Leaving directory `/home/luxibao/hello'

     

    [luxibao@centos hello]$ ls

    hello.c  hello.ko  hello.ko.unsigned  Makefile

    [luxibao@centos hello]$ sudo insmod ./hello.ko

    [luxibao@centos hello]$ dmesg

    .....................................

    SELinux: initialized (dev mqueue, type mqueue), uses transition SIDs

    lo: Disabled Privacy Extensions

    SELinux: initialized (dev proc, type proc), uses genfs_contexts

    fuse init (API version 7.14)

    psmouse.c: Wheel Mouse at isa0060/serio1/input0 lost synchronization, throwing 2 bytes away.

    psmouse.c: resync failed, issuing reconnect request

    Hello, luxibao

     

    [luxibao@centos hello]$ sudo rmmod ./hello.ko

    [luxibao@centos hello]$ dmesg

    ........................................

    SELinux: initialized (dev proc, type proc), uses genfs_contexts

    fuse init (API version 7.14)

    psmouse.c: Wheel Mouse at isa0060/serio1/input0 lost synchronization, throwing 2 bytes away.

    psmouse.c: resync failed, issuing reconnect request

    Hello, luxibao

    Goodbye, luxibao

     

    [luxibao@centos hello]$ lsmod

     

    [luxibao@centos hello]$ dmesg

    SELinux: initialized (dev mqueue, type mqueue), uses transition SIDs

    SELinux: initialized (dev proc, type proc), uses genfs_contexts

    SELinux: initialized (dev mqueue, type mqueue), uses transition SIDs

    lo: Disabled Privacy Extensions

    SELinux: initialized (dev proc, type proc), uses genfs_contexts

    fuse init (API version 7.14)

    psmouse.c: Wheel Mouse at isa0060/serio1/input0 lost synchronization, throwing 2 bytes away.

    psmouse.c: resync failed, issuing reconnect request

    Hello, luxibao

    Goodbye, luxibao

    适用于fl2440开发板:

    [luxibao@centos ~]$ mkdir hello.1

    [luxibao@centos hello]$ ls

    hello.c  hello.ko  hello.ko.unsigned  Makefile

    [luxibao@centos hello]$ sz hello.c

    rz

    Starting zmodem transfer.  Press Ctrl+C to cancel.

    Transferring hello.c...

      100%     748 bytes  748 bytes/s 00:00:01       0 Errors

     

    [luxibao@centos hello]$

    [luxibao@centos hello]$ ls

    hello.c  hello.ko  hello.ko.unsigned  Makefile

    [luxibao@centos hello]$ cd ../

    [luxibao@centos ~]$ cd hello.1

    [luxibao@centos hello.1]$ ls

    Makefile

    [luxibao@centos hello.1]$ rz

    rz waiting to receive.

    Starting zmodem transfer.  Press Ctrl+C to cancel.

    Transferring hello.c...

      100%     748 bytes  748 bytes/s 00:00:01       0 Errors

     

     

    [luxibao@centos hello.1]$ vim Makefile

     

    C=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc

    KDIR?=/home/luxibao/fl2440/kernel/linux-3.0

    obj-m:=hello.o

     

    default:

            $(MAKE) -C $(KDIR) M=`pwd` modules

            make clean

     

    clean:

            rm -f *.o *mod.c *.order *.symvers

     

    [luxibao@centos hello.1]$ ls

    hello.c  Makefile

    [luxibao@centos hello.1]$ make

    make -C /home/luxibao/fl2440/kernel/linux-3.0 M=`pwd` modules

    make[1]: Entering directory `/home/luxibao/fl2440/kernel/linux-3.0'

      CC [M]  /home/luxibao/hello.1/hello.o

      Building modules, stage 2.

      MODPOST 1 modules

      CC      /home/luxibao/hello.1/hello.mod.o

      LD [M]  /home/luxibao/hello.1/hello.ko

    make[1]: Leaving directory `/home/luxibao/fl2440/kernel/linux-3.0'

    make clean

    make[1]: Entering directory `/home/luxibao/hello.1'

    rm -f *.o *mod.c *.order *.symvers

    make[1]: Leaving directory `/home/luxibao/hello.1'

    [luxibao@centos hello.1]$ ls

    hello.c  hello.ko  Makefile

    在开发板上操作:

    >: ifconfig

    eth0      Link encap:Ethernet  HWaddr D6:86:38:B9:4D:CF  

              inet addr:192.168.1.111  Bcast:192.168.1.255  Mask:255.255.255.0

              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

              RX packets:54 errors:0 dropped:0 overruns:0 frame:0

              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

              collisions:0 txqueuelen:1000

              RX bytes:7236 (7.0 KiB)  TX bytes:0 (0.0 B)

              Interrupt:51 Base address:0x2300

    >: tftp -gr hello.ko 192.168.1.2

    hello.ko             100% |*******************************|  2134   0:00:00 ETA

    >: insmod hello.ko

    Hello, luxibao

    >: ls /lib/

    ld-uClibc-0.9.33.2.so       libnsl-0.9.33.2.so

    ld-uClibc.so.0              libnsl.so.0

    libc.so.0                   libpthread-0.9.33.2.so

    libcrypt-0.9.33.2.so        libpthread.so.0

    libcrypt.so.0               libresolv-0.9.33.2.so

    libdl-0.9.33.2.so           libresolv.so.0

    libdl.so.0                  librt-0.9.33.2.so

    libgcc_s.so                 librt.so.0

    libgcc_s.so.1               libstdc++.so

    libm-0.9.33.2.so            libstdc++.so.6

    libm.so.0                   libstdc++.so.6.0.14

    libmudflap.so               libstdc++.so.6.0.14-gdb.py

    libmudflap.so.0             libuClibc-0.9.33.2.so

    libmudflap.so.0.0.0         libutil-0.9.33.2.so

    libmudflapth.so             libutil.so.0

    libmudflapth.so.0           modules

    libmudflapth.so.0.0.0

    >: dmesg

    Linux version 3.0.0 (luxibao@centos.6localdomain) (gcc version 4.5.4 (Buildroot 2012.08) ) #16 Sat Jul 30 10:18:27 CST 2016

    CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177

    CPU: VIVT data cache, VIVT instruction cache

    Machine: SMDK2440

    .................

    usb 1-1: new full speed USB device number 2 using s3c2410-ohci

    hub 1-1:1.0: USB hub found

    hub 1-1:1.0: 4 ports detected

    dm9000 dm9000: eth0: link down

    dm9000 dm9000: eth0: link up, 100Mbps, full-duplex, lpa 0xCDE1

    Hello, luxibao

    >: lsmod

    hello 628 0 - Live 0xbf000000

    >: rmmod hello

    Goodbye, luxibao

    >: dmesg 

    ............................

    Freeing init memory: 132K

    usb 1-1: new full speed USB device number 2 using s3c2410-ohci

    hub 1-1:1.0: USB hub found

    hub 1-1:1.0: 4 ports detected

    dm9000 dm9000: eth0: link down

    dm9000 dm9000: eth0: link up, 100Mbps, full-duplex, lpa 0xCDE1

    Hello, luxibao

    Goodbye, luxibao

     

    遇到的问题和解决方法:

     

    1.编写的Makefile程序make 报错:



    解决:出去多余的?号,Tab键代替空格,检查命令是否出错,单词是否拼写错误。

     

    2.忘记在hello.1下创建hello.c文件


    解决:创建hello.c文件或者从hello文件夹下直接copy   hello.c过来

     

     

    展开全文
  • ARM Linux 下 Hello 驱动程序

    千次阅读 2012-12-08 22:21:21
    今天终于在我的TQ2440 ARM板子上运行了一个简单的驱动程序,惭愧!!!  简单的 Hello 驱动 . ...编写程序驱动程序:  新建一个名为 yikai_hello.c .  内容如下: /********************
  • 现在,你已经创建了空的 Hello World 项目并添加了 Driver.c 源文件,你将通过实现两个基本事件回调函数来编写驱动程序运行所需的最基本的代码。 在 Driver.c 中,首先包括以下标头: C++ #include #...
  • 在上一文中介绍了hello驱动的JNI方法,最终更新在android runtime中的java-native函数表。本文将介绍java的世界中如何通过调用JNI定义的java函数实现hello系统服务进程,为应用程序提供系统服务。 通信代理AIDL ...
  • linux驱动入门-hello设备驱动程序编写及内核的更新(网卡的添加)
  • 编写一个helloworld的驱动程序到内核

    千次阅读 2016-07-26 18:54:09
    编写一个最简单的驱动程序到内核,有两种方式: 1.直接修改Makefile 2.修改Kconfig,提供可选菜单 /*有如下的helloworld.c的驱动程序*/ #include #include static int helloworld_init(void) {  printk...
  • 编写第一个HelloWorld驱动程序

    千次阅读 2016-02-16 11:26:56
    开发应用程序需要用到SDK,内核编程需要使用WDK(Windows Driver Kit),WDK已经自带所需要的头文件,库,C/C++语言及汇编语言的编译器与链接器,所有完全可以不用安装Visual Studio。 1.首先我们下载安装WinDDK,安装...
  • 文章目录最简单的hello word驱动程序1 前言2 hello word 驱动3 驱动程序的makefile4 测试程序的编写5 驱动程序的测试 1 前言 ​ 在前面的文章中已经叙述过开发板中如何运行hello word。接下来本文将讲解如果写一个...
  • 1.首先编写一个hello.c文件,如图所示这就是驱动程序的标准模式。 2.在低版本的linux中驱动程序是一个.o文件,而且在低版本的内核需要手动添加kernel和module模块,所以需要在命令终端输入gcc -c -kernel -module...
  • android基于Linux内核,故该驱动与Linux驱动没有任何不同,为了保证流程的完整性,故这里写一个Hello驱动,供后面的android学习使用,对于已经熟悉linux驱动的朋友,可以跳过此部分的学习,复制驱动编译即可;...
  • Android系统编写Linux内核驱动程序

    千次阅读 2016-09-29 16:52:30
    想起我们第一次学习程序语言时,都喜欢用“Hello, World”作为例子,这里,我们就把这个虚拟的设备命名为“hello”,而这个内核驱动程序也命名为hello驱动程序。其实,Android内核驱动程序和一般Li
  • 学习Linux驱动程序开发,大家都会从hello world的驱动程序开始学习,我也如此,在学习调试该程序时,遇到了很多问题,呵呵,最终得以解决,总结如下: 1 内核版本问题,我在最初安装Redhat时,版本为linux-2.4.20-8...
  • 在Ubuntu 上为Android 系统编写Linux 内核驱动程序 这里,我们不会为真实的硬件设备编写内核驱动程序。为了方便描述为Android 系统编写内核驱动程序的过程,我们使用一 个虚拟的硬件设备,这个设备只有一个4 字节...
  • I.MX6U第一个Hello驱动(不涉及硬件操作) 一、编写驱动代码 在~/imx6ull/nfs/rootfs/root/01_hello_drv/目录下新建hello_drv.c文件,并编写代码 #include <linux/module.h> #include <linux/fs.h> #...
  • 002 hello netty程序编写

    2019-12-04 12:00:24
    Netty是由JBOSS提供的一个java开源框架,Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序;也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,...
  • 这里,我们不会为真实的硬件...想起我们第一次学习程序语言时,都喜欢用“Hello, World”作为例子,这里,我们就把这个虚拟的设备命名为“hello”,而这个内核驱动程序也命名为hello驱动程序。其实,Android内核驱...
  • Linux驱动程序编写演示----编译驱动程序 1驱动编写: #include #include static int __init test_driver_init(void) { /* register this driver */ printk("Hello test_driver , init this driver"); return 0; } ...
  • 学习一门新编程语言的第一步就是写一个打印“hello world”的程序(可以看《hello world 集中营》这个帖子供罗列了300个“hello world”程序例子)在本文中,我们将用同样的方式学习如何编写一个简单的linux内核模块...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 511
精华内容 204
关键字:

编写hello驱动程序