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 2. beep驅(qū)動程序: /*
#include
#include
#include
#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;
}
* 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
#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');
上一篇:tiny210(s5pv210)移植u-boot(基于 2014.4 版本號)——移植u-boot.bin(打印串口控制臺)
下一篇:s5pv210 cpu運行debian
- 熱門資源推薦
- 熱門放大器推薦
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- Microchip 升級數(shù)字信號控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- 【RA】瑞薩mcu聲光控制器
- BD48K55電壓檢測IC在BD48xxx系列中的典型應(yīng)用
- OP213FSZ-REEL耳機輸出放大器多媒體聲音編解碼器典型應(yīng)用
- 【立創(chuàng)開發(fā)板】灰灰四驅(qū)智能小車
- 使用 ROHM Semiconductor 的 BU4918 的參考設(shè)計
- AH1308 應(yīng)用提示 - Mantis TJA1057 5V 高速 CAN 收發(fā)器
- LF25ABDT-TR 2.5V低壓燈泡典型應(yīng)用
- DC1418A-B,使用 LT6604-5、5MHz 雙通道、匹配、全差分低通濾波器的演示板
- LT3091MPT7 500mA LED 驅(qū)動器的典型應(yīng)用,具有接地 LED 接線片(散熱器)
- LTC1855、8 通道、10V 輸入、14 位、100ksps ADC 轉(zhuǎn)換器的典型應(yīng)用,具有停機功能
- 南芯科技推出高集成度多口移動電源解決方案,助力充電寶市場穩(wěn)健發(fā)展
- 英飛凌推出具有超低導(dǎo)通電阻的CoolSiC? MOSFET 750 V G2,適用于汽車和工業(yè)功率電子應(yīng)用
- DigiKey 慶祝 B 站賬號粉絲突破 10 萬,贈送驚喜禮包
- 碳化硅企業(yè) Wolfspeed 啟動破產(chǎn)重組,預(yù)計 2025 年三季度末完成司法重整
- 蘋果被曝考慮放棄自研模型 轉(zhuǎn)而與Anthropic或OpenAI合作
- ?百度文心4.5來襲!英特爾Day0即支持端側(cè)部署
- 【廣瀨電機】關(guān)于中國發(fā)明專利侵權(quán)訴訟達成和解的公告
- 英飛凌BMS解決方案推動電動汽車創(chuàng)新
- 地平線的L3判斷與實踐路徑
- 汽車網(wǎng)絡(luò)升級攻略:CAN-CAN FD-車載以太網(wǎng)