44b0+ucLinux (2.4内核) 蜂鸣器驱动程序

2024-01-04 23:38

本文主要是介绍44b0+ucLinux (2.4内核) 蜂鸣器驱动程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近爸妈和小姨来玩,学习进度稍微有点放缓。这两天抓紧补了下进度,呵呵。下面分享下蜂鸣器的驱动吧。

 

0. 环境

    硬件:44b0开发板

    软件:ucLinux 2.4内核

 

1. 驱动程序

1.1 驱动源码

     在uClinux-dist/linux-2.4.x/drivers/char下建立驱动源文件FengMingQi.c,内容如下

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/errno.h>
#include <asm/uaccess.h>
#include <asm/arch/s3c44b0x.h>
int FMQ_major=188;

#define Non_Cache_Start (0x2000000)
#define Non_Cache_End (0xc000000)
#define BEEP_CMD_SIGNAL 0

/***************PORTS********************/
static int ledman_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);
void Port_Init(void)
{
    (*(volatile unsigned*)S3C44B0X_PCONA)=0x1ff;
    (*(volatile unsigned*)S3C44B0X_PDATB)=0x3ff;
    (*(volatile unsigned*)S3C44B0X_PCONB)=0x3ff;
    (*(volatile unsigned*)S3C44B0X_PDATC)=0xffff; //All I/O is high
    (*(volatile unsigned*)S3C44B0X_PCONC)=0x0f05ff55;
    (*(volatile unsigned*)S3C44B0X_PUPC)=0x30f0; //PULL UP Registor should be enabled to I/O
    (*(volatile unsigned*)S3C44B0X_PDATD)=0xff;
    (*(volatile unsigned*)S3C44B0X_PCOND)=0x0;
    (*(volatile unsigned*)S3C44B0X_PUPD)=0x0;
    (*(volatile unsigned*)S3C44B0X_PDATE)=0x1ff;
    (*(volatile unsigned*)S3C44B0X_PCONE)=0x25568;
    (*(volatile unsigned*)S3C44B0X_PUPE)=0x0df;
    (*(volatile unsigned*)S3C44B0X_PDATF)=0x1ff;
    (*(volatile unsigned*)S3C44B0X_PCONF)=0x20800a;
    (*(volatile unsigned*)S3C44B0X_PUPF)=0x163;
    (*(volatile unsigned*)S3C44B0X_PDATG)=0xff;
    (*(volatile unsigned*)S3C44B0X_PCONG)=0x00ff;
    (*(volatile unsigned*)S3C44B0X_PUPG)=0x0;
    (*(volatile unsigned*)S3C44B0X_SPUCR)=0x7;
    (*(volatile unsigned*)S3C44B0X_EXTINT)=0x0;
    (*(volatile unsigned*)S3C44B0X_NCACHBE0)=0;
}

void Beep(int BeepStatus)
{
    //PE5 Low available
    if(BeepStatus==0)
    {
        (*(volatile unsigned*)S3C44B0X_PDATE)=(*(volatile unsigned*)S3C44B0X_PDATE)&0x1df;      }
    else
    {
        (*(volatile unsigned*)S3C44B0X_PDATE)=(*(volatile unsigned*)S3C44B0X_PDATE)|0x020;
    }
}

static int ledman_ioctl(struct inode*inode, struct file*file, unsigned int cmd, unsigned long arg)
{
    int i;
    if(cmd == BEEP_CMD_SIGNAL)
    {
        printk("beep0/n");
        Beep(0);
        return(0);
    }
    else
    {
        printk("beep1/n");
        Beep(1);
    }
    return 0;
}

struct file_operations FMQ_fops=
{
    ioctl: ledman_ioctl,
};

int FMQ_test_init(void)
{
    int result;
    result=register_chrdev(188, "FengMingQiTest", &FMQ_fops);
    if(result < 0)
    {
        printk("FengMingQiTest: cannot get major number!/n");
        return result;
    }

    Port_Init();
    return 0;
}

void cleanup_FMQmodule(void)
{
    unregister_chrdev(FMQ_major, "FengMingQiTest");
}

 

1.2 修改uClinux-dist/linux-2.4.x/drivers/char/Makefile

      添加一行:obj - $(CONFIG_FMQ_TEST) + = FengMingQi.o

 

1.3 修改uClinux-dist/linux-2.4.x/drivers/ char/Config.in

      添加一行: bool ’test FengMingQi device’ CONFIG_FMQ_TEST

 

1.4 修改uClinux-dist/linux-2.4.x/drivers/ char/mem. c

      添加:

      # ifdef CONFIG_FMQ_TEST
      extern void FMQ_test_init(void) ;
      # endif

 

      同时在chr_dev_init () 函数中添加:
      # ifdef CONFIG_FMQ_TEST
      FMQ_test_init() ;
      # endif

 

1.5 修改uClinux-dist/vendors/Samsung/44B0/Makefile建立设备节点

      DEVICE 部分添加如下内容:

      FengMingQiTest,c,188,0

 

2. 驱动测试程序

2.1 新建路径

      在uClinux-dist/user/建立测试驱动程序的文件夹FMQAppTest

2.2 驱动测试程序源码

      在uClinux-dist/user/FMQAppTest下创建文件FMQAppTest.c,并编写代码如下

 

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

main()
{
    int fd, i, j;
    char buf[10];

    fd = open("/dev/FengMingQiTest", O_RDWR);
    if(fd < 0)
    {
        printf("cannot open file /n");
        exit(0);
    }

    for(i = 0; i < 20; ++i)
    {
        ioctl(fd, 1, 0);
        sleep(100);

        ioctl(fd, 0, 0);
        sleep(100);
    }
    close(fd);
}

 

2.3 Makefile

      在uClinux-dist/user/FMQAppTest下创建文件Makefile,并编辑内容如下:

EXEC = FMQAppTest
OBJS = FMQAppTest.o
all:$(EXEC)
$(EXEC):$(OBJS)
    $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)

romfs:
    $(ROMFSINST) /bin/$(EXEC)

clean:
    -rm -f $(EXEC) *.elf *.gdb *.o

 

2.4 在uClinux-dist/user/Makefile中加入FMQAppTest的路径

      dir_$(CONFIG_USER_FMQ_APP) += FMQAppTest

 

2.5 在uClinux-dist/config/Configure.help中加入

      CONFIG_USER_FMQ_APP
      This program tests Feng Ming Qi driver.

 

2.6 uClinux-dist/config/config.in里加入

      bool ’FengMingQiTest’ CONFIG_USER_FMQ_APP

 

3. 配置内核并编译

3.1 定制内核

      make menuconfig

      注意选择驱动test FengMingQi device和应用程序FengMingQiTest

3.2 编译内核

      make dep

      make clean

      make lib_only

      make user_only

      make romfs

      make image

      make

3.3 结果

      /uClinux-dist/images下会有新生成的三个文件:

      romfs.img  uclinux_ram.bin.gz  uclinux_rom.bin

 

4. 在开发板运行

    1) 通过loadb 0xc008000将uclinux_rom.bin拷到开发板的ram中

    2) erase命令将flash用户区域0x50000之后的部分擦除

    3) cp命令将uclinux_rom.bin从0xc008000拷到0x50000。

    4) 重启开发板

    5) 运行bin下的FMQAppTest

    看看效果吧。是不是蜂鸣器响了?

 

    另外还写了个LED控制的驱动,由于差不多仅仅是寄存器不同而已,这里就不再贴出来了。字符设备的驱动再了解几个,比如看门狗,按键等等,就准备进入块设备的驱动的学习了。当然,这些都是在2.4内核上写的,以后还要升级内核到2.6,同时将这些驱动移植到2.6框架下。不能着急啊,44b0就够我学一段时间了,2440还不能着急啊。

这篇关于44b0+ucLinux (2.4内核) 蜂鸣器驱动程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/570964

相关文章

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

Ubuntu22.04回退系统内核

文章目录 起因回退操作卸载内核禁止内核升级 起因 最近因为系统内核自动升级,导致显卡驱动检测不到,炼丹环境被破坏。无奈只能重装驱动,于是跟着手册操作发现驱动要求的是内核版本是5.15.0-25-generic,而我通过uname -r发现这时候的内核版本是6.8.0-40-generic,看来只能回退了。 我搜索了网上很多的文章,没有一篇文章能够完全解决这个问题,所以在我多次尝

跟我一起玩《linux内核设计的艺术》第1章(四)——from setup.s to head.s,这回一定让main滚出来!(已解封)

看到书上1.3的大标题,以为马上就要见着main了,其实啊,还早着呢,光看setup.s和head.s的代码量就知道,跟bootsect.s没有可比性,真多……这确实需要包括我在内的大家多一些耐心,相信见着main后,大家的信心和干劲会上一个台阶,加油! 既然上篇已经玩转gdb,接下来的讲解肯定是边调试边分析书上的内容,纯理论讲解其实我并不在行。 setup.s: 目标:争取把setup.

编译linux内核出现 arm-eabi-gcc: error: : No such file or directory

external/e2fsprogs/lib/ext2fs/tdb.c:673:29: warning: comparison between : In function 'max2165_set_params': -。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。 。。。。。。。。 host asm: libdvm <= dalvik/vm/mterp/out/Inte

linux 内核提权总结(demo+exp分析) -- 任意读写(四)

hijack_modprobe_path篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm     原理同hijack_prctl, 当用户执行错误格式的elf文件时内核调用call_usermod

linux 内核提权总结(demo+exp分析) -- 任意读写(三)

hijack_prctl篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm   prctl函数: 用户态函数,可用于定制进程参数,非常适合和内核进行交互 用户态执行prctl函数后触发prctl系统

linux 内核提权总结(demo+exp分析) -- 任意读写(二)

hijack_vdso篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm     vdso: 内核实现的一个动态库,存在于内核,然后映射到用户态空间,可由用户态直接调用 内核中的vdso如果被修改

linux 内核提权总结(demo+exp分析) -- 任意读写(一)

cred篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm   每个线程在内核中都对应一个线程结构块thread_infothread_info中存在task_struct类型结构体 struct t