〖Linux〗OK6410a蜂鸣器的驱动程序编写全程实录

发布者:平和的心态最新更新时间:2024-09-29 来源: cnblogs关键字:Linux  OK6410a  蜂鸣器  驱动程序 手机看文章 扫描二维码
随时随地手机看文章

最近在看一本书,受益匪浅,作者是李宁,下边是编写本次蜂鸣器的全程实录:

1. 了解开发板中的蜂鸣器

 1) 查看蜂鸣器buzzer在底板中的管脚信息

 2) 查看蜂鸣器在总线中的信息

 3) 翻看S3C6410芯片手册,查看GPF15相关信息

2. 在了解了开发板中蜂鸣器之后,编写代码对它进行控制。

 由于蜂鸣器是通过PWM(脉冲宽度调制)进行开关控制的,故也称为PWM。

 1) 编写pwm.c(包含Linux驱动模块的主要模型代码)

#include 'pwm_fun.h'


static struct semaphore lock;                   /* 创建信号量*/


//文件打开时,自动操作此函数,使用信号量控制其访问

static int s3c6410_pwm_open(struct inode *inode, struct file *file){

    if (!down_trylock(&lock))                   /* 使用信号量控制只能由一个进程打开 */

    {

        return 0;

    }

    else{

        return -EBUSY;

    }

}


//文件关闭时,自动操作此函数,使用信号量控制其访问

static int s3c6410_pwm_close(struct inode *inode, struct file *file){

    up(&lock);                                  /* 释放信号量 */

    return 0;

}


//文件中关于ioctl的操作

static long s3c6410_pwm_ioctl(struct file *filep, unsigned int cmd, unsigned long arg){


    switch ( cmd ) {

        case PWM_IOCTL_START:    

            pwm_start();

            break;


        case PWM_IOCTL_STOP:    

            pwm_stop();

            break;


        default:    

            break;

    }                /* -----  end switch  ----- */


    return 0;

}


//文件操作的指针

static struct file_operations dev_fops = {

    .owner = THIS_MODULE,

    .open = s3c6410_pwm_open,

    .release = s3c6410_pwm_close,

    .unlocked_ioctl = s3c6410_pwm_ioctl,

};


//设备的属性

static struct miscdevice misc = {

    .minor = MISC_DYNAMIC_MINOR,

    .name = DEVICE_NAME,

    .fops = &dev_fops,

};


//驱动的入口函数

static int __init dev_init(void){

    int ret; 

    init_MUTEX(&lock);                          /* 初始化信号量 */

    ret = misc_register(&misc);

    printk(DEVICE_NAME'tinitializedn');

    return ret;

}


//驱动的退出函数

static void __exit dev_exit(void){

    misc_deregister(&misc);

    printk(DEVICE_NAME'texitedn');

}


module_init(dev_init);

module_exit(dev_exit);


 2) 编写pwm_fun.c(包含对蜂鸣器控制的主要代码)


#include 'pwm_fun.h'


void pwm_start(void){

    unsigned int tmp;

    tmp = ioread32(S3C64XX_GPFCON);

    tmp  &= ~(0x3U<<30);                        /* 最高两位清零,保留其他位 */

    tmp |= (0x2U<<30);                          /* 最高两位设置为10,蜂鸣器发出尖叫声 */

    iowrite32(tmp, S3C64XX_GPFCON);

}


void pwm_stop(void){

    unsigned tmp;

    tmp = ioread32(S3C64XX_GPFCON);

    tmp &= ~(0x3U<<30);                         /* 最高两位清零,蜂鸣器停止尖叫 */

    iowrite32(tmp, S3C64XX_GPFCON);

}


 3) 编写pwm_fun.h(包含一些必须的头文件及宏定义信息)


#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include  

#include

#include


#define DEVICE_NAME 'pwm_dev'

#define PWM_IOCTL_START 1

#define PWM_IOCTL_STOP 0


extern void pwm_start(void);

extern void pwm_stop(void);


 4) 编写Makefile文件(使编译过程自动完成)


obj-m := pwm_driver.o

pwm_driver-objs := pwm.o pwm_fun.o

PWD := $(shell pwd)

CROSS_COMPILE ?= arm-none-linux-gnueabi-

CC := $(CROSS_COMPILE)gcc

CFLAGS += -static

KPATH := /media/Source/Forlinx/android2.3_kernel_v1.01

all: ioctl

    make -C $(KPATH) M=$(PWD) modules

ioctl: ioctl.c

    $(CC) $(CFLAGS) $^ -o $@

clean:

    rm -rf *.o *.ko *.mod.c Module.* modules.* ioctl


 5) 编写测试程序ioctl(用于对驱动程序的测试)


#include

#include

#include

#include

#include


/* 

 * ===  FUNCTION  ======================================================================

 *         Name:  main

 *  Description:  对驱动程序进行测试

 * =====================================================================================

 */

int main ( int argc, char *argv[] )

{

    int file_handler = 0;

    int cmd = 0;

    int arg = 0;

    if (argc < 4)

    {

        printf('Usage: ioctl n');

        return EXIT_FAILURE;

    }

    cmd = atoi(argv[2]);

    arg = atoi(argv[3]);

    printf('dev:%sn', argv[1]);

    printf('cmd:%dn', cmd);

    printf('arg:%dn', arg);

    file_handler = open(argv[1], 0);

    if (file_handler<0)

    {

        printf('open %s failure.n', argv[1]);

    }

    ioctl(file_handler, cmd, arg);

    close(file_handler);

    return EXIT_SUCCESS;


3. 编写好源代码程序之后,交叉编译,上传至OK6410A开发板,进行测试


  1) 配置好交叉编译工具链arm-none-linux-gnueabi-gcc之后,在终端输入make即可自动完成编译


  2) OK6410A(Android2.3.4操作系统)通过USB线连接至PC端,通过adb上传至开发板:


    adb push pwm_driver.ko /tmp/pwm_driver.ko


    adb push ioctl /tmp/ioctl


  3) 通过adb shell打开并控制OK6410A开发板,输入命令安装驱动模块:


    adb shell


    insmod /tmp/pwm_driver.ko


  4) 测试蜂鸣器驱动程序


    /tmp/ioctl /dev/pwm_dev 1 0 #打开蜂鸣器


    /tmp/ioctl /dev/pwm_dev 0 0 #关闭蜂鸣器

关键字:Linux  OK6410a  蜂鸣器  驱动程序 引用地址:〖Linux〗OK6410a蜂鸣器的驱动程序编写全程实录

上一篇:关于Android的HAL的一些理解
下一篇:Android深度探索--HAL与驱动开发第五章读后感

推荐阅读最新更新时间:2024-11-08 11:39

php5.4.5移植到arm-linux摘要,lighttpd配置
php5.4.5移植到arm-linux摘要. 因为有嵌入WEB服务的需求,再常识了N多的开源的嵌入服务后最终选择了lighttpd.Apache太大支了,而且在arm上对swf的支持不好. 其他的都不怎么理想. lighttpd的移植过程就省略了。这里只摘要了PHP移植,采用fastcgi与lighttpd 协作. php版本:php5.4.5 交叉编译设置参数: ./configure --enable-fastcgi --enable-force-cgi-redirect --enable-discard-path --disable-cli --without-iconv --enable-mbstring
[单片机]
表白神器 MAX7219点阵驱动程序
MAX7219驱动点阵的原理图如下: 单片机+MAX7219点阵源程序如下: #include reg52.h #include intrins.h #define uchar unsigned char #define uint unsigned int //定义Max7219端口 sbit Max7219_pinCLK = P2^2; sbit Max7219_pinCS = P2^1; sbit Max7219_pinDIN = P2^0; uchar code disp1 ={ {0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x3C},//0 {0x10,0x18,0x14,0x10,0x
[单片机]
表白神器 MAX7219点阵<font color='red'>驱动程序</font>
风河为Altera Nios II嵌入式提供Linux支持
      Altera公司和Wind River公司宣布为Altera Nios® II嵌入式处理器提供Linux支持。嵌入式开发人员实现基于Nios II处理器的产品时可以在Altera全系列FPGA和HardCopy® ASIC上使用这一Linux解决方案。   Wind River公司的Nios II处理器Linux解决方案基于Linux 2.6内核技术、GNU 4工具链和Eclipse Wind River工作台开发包。该方案依据业界著名的Linux标准和工具,定制支持Nios II指令集,处理器体系结构和定制指令可以在FPGA架构中实现,从而提高了系统性能。   Wind River公司网络解决方案总经理Mik
[嵌入式]
OK6410A 开发板 (八) 83 linux-5.11 OK6410A arm-gdb+JLinkGDBServer+Jlink+JTAG接口 调试 u-boot
之前在 https://blog.csdn.net/u011011827/article/details/118713517 中可以看到 可以调试裸机. 可见我加载了bin文件到0x50000000,这是外部sdram的空间 所以加载之前,必须要初始化,而这个初始化动作,u-boot帮忙给做了(我的板子烧好了u-boot) 在调试裸机前u-boot已经跑到cmdline了 当然你调试bin文件大小小于8KB的裸机程序时,可以将其加载到sram中,这样就不用初始化sdram了. 自己手动加载u-boot 到内存 u-boot 也是一个裸机程序,这个程序和 led.bin 不同 u-boot.bin 要大,但是两个的调试方
[单片机]
恩智浦宣布针对工业4.0推出基于社区的工业Linux发行版
恩智浦半导体(NXP Semiconductors™ N.V.)(纳斯达克代码:NXPI)今日宣布推出用于工业领域的Linux发行版,其中包括实时操作系统扩展和对工厂自动化OEM的时间敏感型网络(TSN)支持。开放式工业Linux系统(OpenIL)打破了实时计算和网络的障碍,以标准的、基于社区的发行版帮助OEM厂商步入工业4.0时代。 OpenIL发行版包括流过滤监管、分时拥塞感知整形和801.1AS时间同步等TSN的支持。TSN以太网集成在恩智浦2017年3月推出的Layerscape LS1028A 工业应用处理器中。 VDC Research Group, Inc.高级行业分析师Dan Mandell表示:“恩智浦
[工业控制]
TQ2440 学习笔记—— 5、Linux烧写——USB
用USB下载线烧写Linux 软件:TQBoardDNW 连接USB下载线和串口线 烧写前首先格式化Nand Flash格式化之后再烧写镜像文件 1、烧写u-boo镜像 2、烧写Linux内核镜像 3、烧写文件系统镜像 4、烧写开机logo镜像 烧写完uboot、内核、文件系统、和logo镜像后,拔掉USB下载线,然后选择命令8即boot the system 就可以启动Linux操作系统,开机后需要进行触屏校准!如果第一次没有校准,后面触屏操作将会很麻烦,也找不到再次校准的设置(我反正没找到,所以又重新烧写了一回) 设置Linux的启动方式 TQ2440 配套的uboot 和Linu
[单片机]
TQ2440 学习笔记—— 5、<font color='red'>Linux</font>烧写——USB
基于嵌入式Linux的倒车影音系统设计
引言 电子信息与数字图像处理技术目前已被广泛地应用在各个领域,车载系统的信息化已成为现代汽车业的重要标志。现在的倒车雷达系统可以为驾驶者提供许多帮助,多数采用超声波测距技术,可以直接显示出车尾与障碍物之间的距离。但由于超声波的散射特性,如果地面有尖锐的突起或存在横在半空的棱角状物体,系统就不能有效地“察觉”。假如能为现有的倒车系统增加一个可视功能,那么驾驶员在倒车时不必回头就可清楚车后的情况。本文设计了一种可视化安全倒车系统,该系统采用嵌入式Linux操作系统内核驱动USB摄像头实现车后状况实时监控,通过判断超声波测距是否达到阈值来启动语音报警功能。 1 系统方案设计 如图1所示,系统由主控模块、超声波收发模块、USB摄像头图像采
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved