国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

S5PV210之beep驅(qū)動從linux2.6.35.7移植到linux3.0.8

發(fā)布者:幸福微風(fēng)最新更新時間:2024-12-31 來源: cnblogs關(guān)鍵字:S5PV210  linux2  6  7  移植  linux3 手機看文章 掃描二維碼
隨時隨地手機看文章

beep驅(qū)動從linux2.6.35.7內(nèi)核移植到linux3.0.8,修改的部分為:

  '='后面的為修改后的

  .ioctl  =  .unlocked_ioctl

  static int beep_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)

  = static int beep_ioctl(struct file *file, unsigned int cmd, unsigned long arg)

  beep_ioctl函數(shù)中struct inode *inode去掉,原因是beep測試程序中ioctl函數(shù)中參數(shù)個數(shù)與beep驅(qū)動相對應(yīng)。如果沒有去掉,測試程序能進入beep驅(qū)動中beep_ioctl函數(shù),但BEEP_START_CMD不能與驅(qū)動中beep_ioctl匹配。

 

1. beep測試程序為:

#include
#include
#include
#include   //O_RDWR定義在該文件中
#include

#define BEEP_MAGIC 'k'
#define BEEP_START_CMD _IO (BEEP_MAGIC, 1)
#define BEEP_STOP_CMD _IO (BEEP_MAGIC, 2)



int main()
{
    int i = 0;
    int dev_fd;
    dev_fd = open('/dev/beep',O_RDWR );
    if ( dev_fd == -1 ) {
        printf('Cann't open file /dev/beepn');
        exit(1);
    }
    printf('Start beepn');
    ioctl (dev_fd, BEEP_START_CMD,0);
    getchar();
    ioctl (dev_fd, BEEP_STOP_CMD,0);
    printf('Stop beep and Close devicen');
    close(dev_fd);
    return 0;
}

 

2. beep驅(qū)動程序:

/*
 * linux/drivers/char/mini210_beep.c
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
#include
#include
#include
#include
#include
//#include
//#include
#include
//#include
//#include
#include
#include

#include
#include
#include
#include
#include gpio.h>
#include
#include
#include
#include

#include
#include
#include

#include
#include
#include
#include

#define BUZZER_PMW_GPIO            S5PV210_GPD0(0)

static int beep_major = 0;

#define BEEP_MAGIC 'k'
#define BEEP_START_CMD _IO (BEEP_MAGIC, 1)
#define BEEP_STOP_CMD _IO (BEEP_MAGIC, 2)

/*
 * Open the device; in fact, there's nothing to do here.
 */
int beep_open (struct inode *inode, struct file *filp)
{
    return 0;
}

ssize_t beep_read(struct file *file, char __user *buff, size_t count, loff_t *offp)
{
    return 0;
}

ssize_t beep_write(struct file *file, const char __user *buff, size_t count, loff_t *offp)
{
    return 0;
}

void beep_stop( void )
{
    s3c_gpio_cfgpin(BUZZER_PMW_GPIO, S3C_GPIO_OUTPUT);
    gpio_set_value(BUZZER_PMW_GPIO, 0);

}

void beep_start( void )
{
    s3c_gpio_cfgpin(BUZZER_PMW_GPIO, S3C_GPIO_OUTPUT);
    gpio_set_value(BUZZER_PMW_GPIO, 1);
    
}

//static int beep_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
//unsigned long arg)
static int beep_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
    //add your src HERE!!!
    printk('beep_ioctl');
    switch ( cmd ) {
        case BEEP_START_CMD: {
            beep_start();    
            printk('start');
            break;
        }
        case BEEP_STOP_CMD: {
            printk('stop');
            beep_stop();    break;
        }
        default: {
            break;
        }
    }
    return 0;
    
}

static int beep_release(struct inode *node, struct file *file)
{
    return 0;
}

static void beep_setup_cdev(struct cdev *dev,int minor,
        struct file_operations *fops)
{
    int err, devno = MKDEV(beep_major, minor);
    
    cdev_init(dev, fops);
    dev->owner = THIS_MODULE;
    dev->ops = fops;
    err = cdev_add (dev, devno, 1);
    /* Fail gracefully if need be */
    if (err)
        printk (KERN_NOTICE 'Error %d adding beep%d', err, minor);
}

static struct file_operations beep_remap_ops = {
    .owner   = THIS_MODULE,
    .open    = beep_open,
    .release = beep_release,
    .read    = beep_read,
    .write   = beep_write,
    .unlocked_ioctl   = beep_ioctl,
    //.ioctl   = beep_ioctl,    
};

static struct cdev BeepDevs;

static int __init beep_init(void) {
    int result;
    dev_t dev = MKDEV(beep_major,0);
    char dev_name[]='beep';

    if (beep_major)
        result = register_chrdev_region(dev,1,dev_name);
    else{
        result = alloc_chrdev_region(&dev,0,1,dev_name);
        beep_major = MAJOR(dev);
    }
    if (result < 0) {
        printk(KERN_WARNING 'beep: unable to get major %dn', beep_major);    
        return result;
    }
    if (beep_major == 0)
        beep_major = result;
    
    beep_setup_cdev(&BeepDevs, 0, &beep_remap_ops);
    printk('beep device installed, with major %dn', beep_major);
    printk('The device name is: %sn', dev_name);
    return 0;

}
static void __exit beep_cleanup(void)
{
    cdev_del(&BeepDevs);
    unregister_chrdev_region(MKDEV(beep_major,0),1);
    printk('beep device uninstalledn');
}

module_init(beep_init);
module_exit(beep_cleanup);

MODULE_LICENSE('GPL');
MODULE_AUTHOR('mingli Inc.');
MODULE_DESCRIPTION('S5PV210 beep Driver');


關(guān)鍵字:S5PV210  linux2  6  7  移植  linux3 引用地址:S5PV210之beep驅(qū)動從linux2.6.35.7移植到linux3.0.8

上一篇:tiny210(s5pv210)移植u-boot(基于 2014.4 版本號)——移植u-boot.bin(打印串口控制臺)
下一篇:s5pv210 cpu運行debian

小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved