• 第八章 蜂鸣器驱动


    1.linux驱动的代码重用(采用标准C程序):分为静态和动态重用

    2.如果Linux 驱动要使用第三方的源代码 , 那 么 就不得不编译多个源代码文件 ,最终生成.ko 文件或编译进linux内核

    3.在main.c中通过extern关键字使用 fun.c中的函数,通过包含 product.h 文件使用 product.c 文件中的函数

    4.这两个宏分别用来标识linux驱动始化函数(main_init)和linux驱动卸载函数,在这两个函数中使用_init和_exit并不是必需的,但使用它们,会提高linux驱动的运行效率。因为这两个宏实际上是编译指令

    5.最关键一步是编写Makefile文件代码如下

    # Makefile obj-m :=multi_file_driver.o multi_file_driver-y:=main.c fun.c product

    6.在 multi_file_driver目录中有一个 build,sh 脚本文件,用于编译和测试本节的示例.

    7.卸载这两个 Linux 驱动的顺序正好相反,要先卸载 symboI_consumer ,然后才能卸载symbol_producer,

    输入# lsmod|grep symbol可以看到 symbol_prod'uce庐和 symbol_consumer之 间的依赖关系。

    8.depmod 命令用于分析 Linux模块之间的依赖性,这一功能在多个Linux模块之间拥有复杂的依赖关系方面非常有用。使用 depmod分析完 Linux模块的依赖关系后,就可以使用 modprobe 命令装载 Linux模块.modprobe 命令全根据depmod命令生成的 Linux模块依赖关系来装载Linux模块,并不需要像使用insmod命令那样挨个装载 Linux 模块。

    首先需要使用下面的命令生成 symbol_producer 和 symbol_consumer 的依赖关系。

    #depmod /root/drivers/ch08/driver_shared/export_symbol/symbol_consumer.ko

    /root/drivers/ch08/driver_shared/export_symbol/symbol_producer.ko

    9.强行卸载linux驱动

    (1)初始化函数崩溃:由于 Linux 驱动模块的初始化函数(通过module_init 宏指定的函数〉进行了某些操作而崩溃,从而导致初始化函数无法正常返回.

    这种情况的关键是引用计数器的值和引用者不一致.

    //使module指向的linux驱动模块的引用计数器加1,成功返回1,失败返回0

    static inline int try_module_get(struct module *module)

    //使module指向的linux驱动模块的引用计数器减1

    externvoid module_put(struct module *module)

    (2)卸载函数被阻塞:在使用rmmod命令卸载 Linux 驱动时,系统会调用卸载函数(通过modu le_exit 宏指定的函数),只有卸载函数成功返回肘, Linux 驱动才会被卸载.如果卸载函数被阻塞(可能是死循环,并发等情况引起的阻塞), rmmod命令也会被阻塞.也就是说永远不会执行到卸载 Linux 驱动模块的代码.只要将原来的卸载函数替换成一个空的卸载函数即可.

    由于module结构体的地址在内核空间,因此,只能编写linux驱动来卸载另一个linux驱动.

    10.蜂鸣器也称为 PWM (脉冲宽度调制),基本原理是通过脉冲来控制蜂鸣器的打开和停止.PWM使用端口F的GPFCON寄存器进行控制.该寄存器在 Linux内核中对应的宏是S3C64XX_GPFCON,,该宏表示 GPFCON 寄存器寄存器的虚拟地址. GPFCON只用了最高两位(30和31位)来控制PWM,当最高两位为10时,打开PWM.为00时停止PWM.所以只需要通过iowrite32函数为 GPFCON 寄存器设置不同的值即可。

    11.测试蜂鸣器驱动:

    首先进入/root/drivers/ioct1目录,执行build.sh脚本文件编译和上传ioct1文件.

    打开PWM:#  ./ioctl/dev/pwm_dev 1 0

    停止PWM:#  ./ioctl/dev/pwm_dev 0 0

  • 相关阅读:
    一步步介绍如何给项目添加单元测试
    日期格式化在移动端的问题
    使用VW时,图片的问题
    转:vw适配中使用伪类选择器遇到的问题
    ES6模块的import和export用法总结
    转:如何在Vue项目中使用vw实现移动端适配
    PhpStrom添加调试功能
    小程序商城笔记
    使用TortoiseGit对android studio工程进行代码版本控制
    Android Studio 常见异常解决办法
  • 原文地址:https://www.cnblogs.com/yqing/p/5653036.html
Copyright © 2020-2023  润新知