openwrt之字符设备驱动开发示例

第四章 字符设备驱动及应用程序模板测试

字符设备驱动软件包测试

1. 将模板 mydrv 放到 openwrt 源码特定目录 openwrt/package/kernel/下

mydrv模板结构

2. 配置对该驱动的编译支持

  $ cd openwrt
  $ make menuconfig
  # 选择 Kernel modules -> Other modules -> kmod-mydrv
  # 按 y 选中
  # 保存退出

3. 字符设备驱动软件包 Makefile 介绍

  include $(TOPDIR)/rules.mk
  include $(INCLUDE_DIR)/kernel.mk
  include $(INCLUDE_DIR)/package.mk #以上三个用来关联OpenWrt

  PKG_NAME:=mydrv #字符设备驱动模块名称
  PKG_RELEASE:=1 #版本号

  define KernelPackage/mydrv #内核模块
    SUBMENU:=Other modules #进行归类
    TITLE:=mydrv #标题
    FILES:=$(PKG_BUILD_DIR)/mydrv.ko #模块文件
    KCONFIG:=
  endef

  define KernelPackage/mydrv/description
    This is a mydrv drivers #描述
  endef

  MAKE_OPTS:= \ #编译前指定工具和内核arch等
    ARCH="$(LINUX_KARCH)" \
    CROSS_COMPILE="$(TARGET_CROSS)" \
    SUBDIRS="$(PKG_BUILD_DIR)"

  define Build/Prepare #编译前准备工作
    mkdir -p $(PKG_BUILD_DIR)
    $(CP) ./src/* $(PKG_BUILD_DIR)/
  endef

  define Build/Compile #进行编译
    $(MAKE) -C "$(LINUX_DIR)" \
    $(MAKE_OPTS) modules
  endef

  $(eval $(call KernelPackage,mydrv))

src 目录下的 Makefile :obj-m += mydrv.o告诉内核添加的模块目标文件名称为 mydrv.o

4. 编译驱动包

  $ cd openwrt
  $ make package/kernel/mydrv/compile V=99 #如果make有问题,试试root用户

编译得到的固件在目录 openwrt/bin/ramips/packages/base/ 下,名称为kmod-mydrv_3.18.29-1_ramips_24kec.ipk

5. 加载驱动模块到内核及其卸载

  # 将模块拷贝到 widora
  $ opkg install kmod-mydrv_3.14.25-1_ramips_24kec.ipk
  # 安装完成后在目录 `/lib/modules/3.18.29/`下可以找到驱动
  $ insmod mydrv.ko #加载
  $ rmmod mydrv.ko #卸载

加载测试

6. 驱动开机自动加载

  $ cd /etc/modules.d
  $ vi 61-mydrv #61表示不使用外接usb类的自启动程序,分隔符‘-’后面接驱动模块名称!
  # 在创建的该文件中写入: mydrv 即驱动的名称。
  # 最后,必须保证 mydrv.ko 驱动模块文件放在`/lib/modules/3.14.25/`中
  $ reboot
  $ lsmod #令查询当前已经加载的驱动模块

应用程序软件包测试

1. 将模板 mydrv_app 应用程序软件包放在 OpenWrt 的一个特定的目录 openwrt/package/

2. 配置 OpenWrt 支持软件包的编译

  $ cd openwrt
  $ make menuconfig
  # 选择 Utilities -> mydrv_app -> y 选中

3. 应用程序软件包源码介绍

  #include <stdio.h>
  #include <string.h>
  #include <fcntl.h>
  #include <unistd.h>
  #include <sys/types.h>
  #include <sys/stat.h>
  #include <sys/ioctl.h>

  int main(int argc , char** argv)
  {
    int fd;
    int num = 1;
    //打开驱动模块
    fd = open("dev/mydrv" , O_RDWR|O_NONBLOCK);
    if(fd < 0)
    {
        printf("can't open /dev/mydrv\n");
        return -1;
    }
    //函数测试
    write(fd,&num,1);
    read(fd,&num,1);
    ioctl(fd,1,1);
    close(fd);
    return 0;
  }

4. 编译应用程序软件包

  $ cd openwrt
  $ make package/mydrv_app/compile V=99
  $ make package/mydrv_app/install V=99
  $ make package/index V=99
  # 编译后的固件存放在目录 `openwrt/bin/ramips/packages/base`下,名称为`mydrv_app_1_ramips_24kec.ipk`

5. 应用程序的安装和使用

  # 将程序拷贝到 widora
  $ opkg install mydrv_app_l_ramips_24kec.ipk
  $ mydrv_app #运行程序

安装测试

猜你喜欢

转载自blog.csdn.net/robothj/article/details/80036201