4412 gpio读取pwm

发布者:binggege最新更新时间:2022-03-09 来源: eefocus关键字:gpio 手机看文章 扫描二维码
随时随地手机看文章

一、可以使用的GPIO管脚

去掉占用调用的GPIO驱动,包括leds,buzzer,camera ov5640,WIFI mt6620 ,Keyboards

  • VIDEO_OV5640– Device Drivers

    • – Multimedia support(MEDIA_SUPPORT [=y])

    • – Video capture adapters(VIDEO_CAPTURE_DRIVERS [=y])(去掉) 

  • MTK_COMBO_CHIP_MT6620– Device Drivers

    • – MediaTek Connectivity Combo Chip Config

    • – MediaTek Connectivity Combo Chip Support (MTK_COMBO [=y])(去掉)

    • – Select Chip ( [=y]) 

  • Enable LEDS config– Device Drivers

    • – Character devices

    • – Enable LEDS config 

  • Enable BUZZER config

    • – Device Drivers

    • – Character devices

    • – Enable BUZZER config

  • Enable Keyboards

    • Device Drivers  --->

    • Input device support  --->

    • Keyboards  ---> 

led_gpios数组

static int led_gpios[] = {

    EXYNOS4_GPL2(0), EXYNOS4_GPK(1),    /* Led IO 2个 */

    EXYNOS4_GPD0(0),              /* BUZZER IO 1个 */


    EXYNOS4_GPX1(0), EXYNOS4_GPX1(3),EXYNOS4_GPX1(5),EXYNOS4_GPX1(6),    /* 矩阵健盘8个 */

    EXYNOS4_GPX3(0),EXYNOS4_GPX2(6),EXYNOS4_GPX2(7),EXYNOS4_GPX3(5),


    EXYNOS4212_GPJ1(3),EXYNOS4_GPL0(1),EXYNOS4_GPL0(3),EXYNOS4212_GPJ1(0),      /* 摄像头14个 */

    EXYNOS4212_GPJ1(2),EXYNOS4212_GPJ1(1),EXYNOS4212_GPJ0(7),EXYNOS4212_GPJ0(6),

    EXYNOS4212_GPJ0(5),EXYNOS4212_GPJ0(4),EXYNOS4212_GPJ0(0),EXYNOS4212_GPJ0(3),

   EXYNOS4212_GPJ0(1),EXYNOS4212_GPJ0(2),


    EXYNOS4_GPK3(6),EXYNOS4_GPK3(1),EXYNOS4_GPK3(4),EXYNOS4_GPK3(0),      /* WIFI 7个 */

    EXYNOS4_GPK3(3),EXYNOS4_GPK3(5),EXYNOS4_GPC1(1),

};


二、设计思路

  • 通过外部中断来处理电路上升沿和下降沿的跳变处理

  • 通过读取IO管脚,来判断是上升沿触发还是下降沿触发

  • 使用do_gettimeofday来获取时间戳,从而计算高电平时间

下面是我的源码:

read_pwm.c

#include

#include


/* */

#include

#include

#include


#include

#include

#include

#include


#include

#include

#include


#include


#define DRIVER_NAME "ReadPwm"

#define DEVICE_NAME "read_pwm"


MODULE_LICENSE("Dual BSD/GPL");

MODULE_AUTHOR("TOPEET");


#define GPIO_CHG_FLT    EXYNOS4_GPX1(0)


static int up_flag = 0;

struct platform_device *dev_int;

/* led: KP_COL0, VDD50_EN */

/* BUZZER: MOTOR_PWM */

/* keyboards: CHG_FLT, HOOK_DET, CHG_UOK, XEINT14_BAK, GM_INT1,

    6260_GPIO1, CHG_COK, XEINT29/KP_ROW13/ALV_DBG25 */

/* camera: CAM_MCLK, CAM2M_RST, CAM2M_PWDN, CAM_D5, CAM_D7, CAM_D6,

    CAM_D4, CAM_D3, CAM_D2, CAM_D1, CAM_PCLK, CAM_D0, CAM_VSYNC, CAM_HREF */

/* WIFI: WIFI_D3, WIFI_CMD, WIFI_D1, WIFI_CLK, WIFI_D0, WIFI_D2,GPC1_1 */

struct timeval tv_begin, tv_end;

static int interval = 0;

struct semaphore sem;


static irqreturn_t qint8_interrupt(int irq, void *dev_id)

{

    int ret;

    ret = gpio_get_value(GPIO_CHG_FLT);

    if(ret == 0) {

        do_gettimeofday(&tv_end);

        if(tv_end.tv_usec - tv_begin.tv_usec > 0) {

            down(&sem);

            interval = tv_end.tv_usec - tv_begin.tv_usec;

            up(&sem);

        }

        // if(printk_ratelimit()) {

        //     printk("tv_end.usec:%d - tv_begin.usec:%d =n%dn", tv_end.usec,

        //         tv_begin.usec, tv_end.usec - tv_begin.usec);

        // }

    } else if(ret == 1) {

        do_gettimeofday(&tv_begin);

    }

    return IRQ_HANDLED;

}


static int read_pwm_open(struct inode *inode, struct file *file)

{

    printk(KERN_EMERG "read pwm openn");

    return 0;

}


static int read_pwm_release(struct inode *inode, struct file *file)

{

    printk(KERN_EMERG "read pwm releasen");

    return 0;

}


static ssize_t read_pwm_read(struct file *filp, char __user *buff, size_t size, loff_t *ppos)

{

    unsigned int key_value = 0;

    char temp[2];

    int ret;

    // printk(KERN_EMERG "sizeof(key_value) is %dn", sizeof(key_value));

    if(size != sizeof(temp)) {

        return -1;

    }

    down(&sem);

    key_value = interval;

    up(&sem);


    temp[0] = ((key_value)&0xff);

    temp[1] = ((key_value>>8)&0xff);


    ret = copy_to_user(buff, temp, sizeof(temp));


    return ret;

}


static struct file_operations read_pwm_ops = {

    .owner      = THIS_MODULE,

    .open       = read_pwm_open,

    .release    = read_pwm_release,

    .read       = read_pwm_read,

};


static struct miscdevice read_pwm_dev = {

    .minor  = MISC_DYNAMIC_MINOR,

    .name   = DEVICE_NAME,

    .fops   = &read_pwm_ops,

};


static int read_pwm_probe(struct platform_device *pdv)

{

    int ret;

    printk(KERN_EMERG "tread pwm start initializedn");

    /* set up gpio */

    // ret = gpio_request(GPIO_CHG_FLT, "GPX1_0");

    // if(ret < 0) {

    //     printk(KERN_EMERG "request GPIO %d for read pwm failedn", GPIO_CHG_FLT);

    //     return ret;

    // }


    // s3c_gpio_cfgpin(GPIO_CHG_FLT, S3C_GPIO_INPUT);

    // s3c_gpio_setpull(GPIO_CHG_FLT, S3C_GPIO_PULL_NONE);

    ret = request_irq(IRQ_EINT(8), qint8_interrupt, IRQ_TYPE_EDGE_BOTH, "my_eint8", pdv);

    if(ret < 0) {

        printk(KERN_EMERG "request irq 8 failed.n");

        return 0;

    }

    up_flag = 1;

    dev_int = pdv;

    sema_init(&sem, 1);

    /* register */

    ret = misc_register(&read_pwm_dev);

    if(ret < 0) {

        gpio_free(GPIO_CHG_FLT);

        misc_deregister(&read_pwm_dev);

        return -EINVAL;

    }


    return 0;

}


static int read_pwm_remove(struct platform_device *pdv)

{

    printk(KERN_EMERG "tread pwm removen");


    // gpio_free(GPIO_CHG_FLT);

    free_irq(IRQ_EINT(8), pdv);

    misc_deregister(&read_pwm_dev);

    return 0;

}


static void read_pwm_shutdown(struct platform_device *pdv)

{


}


static int read_pwm_suspend(struct platform_device *pdv, pm_message_t pmt)

{

    return 0;

}


static int read_pwm_resume(struct platform_device *pdv)

{

    return 0;

}


struct platform_driver read_pwm_driver = {

    .probe      = read_pwm_probe,

    .remove     = read_pwm_remove,

    .shutdown   = read_pwm_shutdown,

    .suspend    = read_pwm_suspend,

    .resume     = read_pwm_resume,

    .driver = {

        .name   = DRIVER_NAME,

        .owner  = THIS_MODULE, 

    }

};


static int read_pwm_init(void)

{

    int DriverState;


    printk(KERN_EMERG "Read pwm init enter!n");

    DriverState = platform_driver_register(&read_pwm_driver);


    printk(KERN_EMERG "tDriverState is %dn", DriverState);

    return 0;

}


static void read_pwm_exit(void)

{

    printk(KERN_EMERG "Read pwm exit!n");

    platform_driver_unregister(&read_pwm_driver);

}


module_init(read_pwm_init);

module_exit(read_pwm_exit);


还有一个问题,卸载模块后再装载就会报错,不知道为什么。

app源码:

read_pwm_app

#include

#include

#include

#include

#include



#define READ_PWM "/dev/read_pwm"


int main()

{

    long value = 0;

    int fd;

    char buff[2];

    int ret;


    fd = open(READ_PWM, O_RDWR|O_NDELAY);

    if(fd < 0) {

        perror("open");

    }


    while(ret = read(fd, buff, sizeof(buff)) >= 0) {

        printf("value is %dn", buff[0]|buff[1]<<8);

        usleep(100000);

    }

    printf("sizeof(value) is %dn", sizeof(buff));

    printf("read return is %dn", ret);

    return 0;

}


关键字:gpio 引用地址:4412 gpio读取pwm

上一篇:4412 使用小度wifi
下一篇:4412 4路pwm输出

推荐阅读最新更新时间:2024-11-13 11:51

stm8的GPIO引脚模式
GPIO_Mode_In_FL_No_IT 浮空输入无中断 GPIO_Mode_In_PU_No_IT 上拉输入无中断 GPIO_Mode_In_FL_IT 浮空输入有中断 GPIO_Mode_In_PU_IT 上拉输入有中断 GPIO_Mode_Out_OD_Low_Fast 开漏-输出低-高速 Output open-drain, low level, 10MHz GPIO_Mode_Out_PP_Low_Fast 推挽-输出低-高速 Output push-pull, low level, 10MHz GPIO_Mode_Out_OD_Low_Slow 开漏-输出低-低速 Output open
[单片机]
如何测量MSP430功耗
众所周知,MSP430以其超低功耗而著称。但是很多用户反应,在实际应用中,测量MSP430的功耗时,测量结果和MSP430数据手册相差甚远。其实这里主要涉及到两方面的内容: 1. 如何使用MSP430合理的设计硬件和软件,使整个应用最大限度的达到低功耗? 2. 如何测量MSP430的功耗? 就如何测量MSP430功耗,我来分享一下我个人的经验。 一、未使用的GPIO的处理 为了使MSP430最大限度的达到低功耗,对于MSP430未使用的GPIO而言,应该将其设置为输出;或者是设置为输入,但是将管脚的电平固定,可以通过外部电路将管脚连接至Vcc或者GND,也可使能内部上下拉电阻,将管脚电平固定。 对于MSP4
[单片机]
如何测量MSP430功耗
分享tiny4412,emmc烧录u-boot, 支持fastboot模式烧写emmc
前言: 按照光盘介绍编译烧写U-boot也无法启动板子,只有superboot使用后才可以启动板子。到此大家估计很多和我想的一样,如何使用开源的u-boot来启动开发板。 言归正传,我们的目的是要用u-boot来运行tiny4412. 正文: 首 先要注意的是,原版的内核配置把CONFIG_ARM_TRUSTZONE给打开了,这个与superboot.bin是配套使用的,但是u-boot经 研究发现暂不支持TZ模式,所以内核配置要把这个选项去掉。不然按照教程会出现死机。论坛也有很多网友发现了此现象,不再赘述。(后面有时间本人会研究下 trustzone机制) 把TZ选项去掉后,通过SD卡烧录u-boot可以把板子带起来,这个不是
[单片机]
ARM7单片机(学习ing)—(一)、输入/输出端口GPIO编程—02
一、输入/输出端口GPIO编程 一—(02)、控制LCD1602显示~~ 废话不多说了~~直接上图~~ 然后是程序~~ MDK1_2.c //------------------------------------------------------------------------------ //这个当然是主函数了 #include lpc210x.h #include macroandconst.h #include delay.h #include lcdinit.h //----------------------------------------------------------------------
[单片机]
ARM7单片机(学习ing)—(一)、输入/输出端口<font color='red'>GPIO</font>编程—02
STM32 GPIO相关知识点
简介:开漏输出:OC门的输出就是开漏输出;OD门的输出也是开漏输出。TTL电路有集电极开路OC门,MOS管也有和集电极对应的漏极开路的OD门,它的输出就叫做开漏输出。它可以吸收很大的电流,但是不能向外输出电流。所以,为了能输入和输出电流,它使用的时候要跟电源和上拉电阻一齐用。 OC门开漏输出和OD门开漏输出都是为了同一个目的,都是为了实现逻辑器件的线与逻辑,当然选用不同的外接电阻也可以实现外围驱动能力的增加。当你应用此电路的时候,要注意应用时要加上拉电阻接电源,这样才能保证逻辑的正确,在电阻上要根据逻辑器件的扇入扇出系数来确定,但一般mos电路带载同样的mos电路能力比较强,所以电阻通常可以选择2.2k,4.9k这样一些常用的
[单片机]
jLink V8调试exynos 4412 u-boot的几点补充
/** ****************************************************************************** * @author Maoxiao Hu * @version V1.0.0 * @date Dec-2014 ****************************************************************************** * COPYRIGHT 2014 ISE of SHANDONG UNIVERSITY **************************************************
[单片机]
jLink V8调试exynos <font color='red'>4412</font> u-boot的几点补充
msp430单片机GPIO基础理解
单片机的端口可以通过方向寄存器PxDIR来设置输出(1)还是输入(0) 可以通过输入寄存器PxIN来查看输入端口引脚的电平,尝用来判断按键是否按下。 也可通过PxIE,PxIES,PxIFG实现按键中断,按下某键后执行一段中断程序。 可通过输出寄存器PxOUT来写入输出,常用来控制数码管显示和指示灯等输出设备显示。 PxOUT |= BIT0;//不影响x端口其他引脚而设置x.0引脚输出1 PxOUT &= ~BIT0;//不影响x端口其他引脚而设置x.0引脚输出0 BIT0等价于0x01 0000 0001 BIT7等价于1000 0000 if(!(PxIN & BIT0))判断x.0引脚是否按下 定时器要设置时钟源,捕获/比
[单片机]
ARM Cortex-A9 (tiny 4412)
要求 移植linux增加系统调用并烧写至开发板 详细步骤 一、搭建linux编译环境 1、GCC 编译器的安装: tar xzvf arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz -C/ arm-linux-gcc -v //查看GCC版本 2、gedit ~/.bashrc export PATH=$PATH:/opt/FriendlyARM/toolschain/4.5.1/bin 3、reboot -p 重启 4、cp -f tiny4412_android_defconfig .config make -- 编译 5、安装libz.so yum install z
[单片机]
ARM Cortex-A9 (tiny <font color='red'>4412</font>)

推荐帖子

图片渐进渐出效果
RT,要实现图片渐进渐出效果,我是通过改变图片透明度来做的,但是这样速度太慢了,不行啊;有什么好的算法或者资料吗?谢谢!图片渐进渐出效果一点一点移动,控制显示位置,不行么?LZ的透明效果具体是如何实现的?如果LZ想要透明那样的效果,在EVC下估计没有什么现成的好的算法。只能自己研究算法!关注一下关注一下AlphaBlendAPI引用1楼ultrapro的回复:一点一点移动,控制显示位置,不行么? ----------------------------
282767310 嵌入式系统
这些天kei调试的一些小收获
1.food.position.x=(4*(TL0%4)-1);这个表达式在TL0%4为0的情况下会使得food.position.x=-1,表达成十六进制会得到0xff(这里的food.position.x是int型)。而我的程序段里有这么两句“P2=table;和u8table={0x7f,0xbf,0xdf,0xef};”把hex文件焼写进去以后,我发现那个数码管dp点有时亮有时不亮,这个BUG困扰我好久,于是我追踪food.position.x,得到它竟然出现了
zzbeagle 综合技术交流
XMC4700 Relax 5V shield 评测:DAVE4使用
在上一节我们学习了解了XMC4700的原理图设计,现在我们学习如何开发XMC4700,对于一个MCU软件编写来说,往往需要一个IDE,不同厂家提供不同的开发环境,以前我们开发ARM内核的MCU都是要不MDK,要不IAR,两者都不错的开发环境,对于XMC4700来说,英飞凌公司提供了自己专门的开发环境DAVE4。DAVE4是英飞凌公司开发的基于Eclipse的免费开发环境。除了一般的代码编辑和调试功能以外,它的内部还集成了很多APP,这些APP都是基于控件的形式提供给用户的,我们
qwerghf 单片机
3D电视“外热内冷” 中国企业或错过良机
  每经记者李潮文发自深圳  继LED背光液晶电视后,厂家批发交通卡贴纸,目前最火爆的家电产品莫过于3D电视。一些日、韩彩电生产企业已经开始在中国市场推广3D电视。不少国内家电企业却反应平平,他们表示目前公司发展的重点不在3D电视上,因为市场需求不强烈。  “从世界市场来看,3D电视肯定是下一个发展趋势。”分析人士对此表示,电子产品盈利都在前期而不是后期,等国内企业反应过来再去发展3D电视时,势必已错过赚钱的最佳时期。  企业:发展3D电视还不是时机  据《每日经
wangpush LED专区
输入电阻(0-20K)转4-20MA电路--顶!
该电路在制作液位传感器(电阻式)中得到了广泛应用。输入电阻(0-20K)转4-20MA电路--顶!:L:L:L:L好贵啊。。不过我需要,买了啊,。。。希望不要是标题党。。。确实,太贵了~~~确实,太贵了~~~我需要,赚钱呀~!!!!我需要,赚钱呀~!!!!我需要,赚钱呀~!!!!太贵了。。。没钱啊234324楼主非洲来的,太黑了没用上郁闷至极:Q:Q:Q:Q:Q确实有点贵啊!!!!!!!!可惜了额米的钱了感謝分享~~~~~~~~~~~~~~~~
yixiao22 测试/测量
新能源汽车充电桩的内部结构、充电原理知识
国家标准《电动汽车传导充电用连接装置第3部分:直流充电接口》(GB/T20234.32015)规定直流充电接口插头、插座的触头分布方式,分别如图所示:去年9月7日,由工业和信息化部提出、全国汽车标准化技术委员会归口的GB/T20234.1-2023《电动汽车传导充电用连接装置第1部分:通用要求》和GB/T20234.3-2023《电动汽车传导充电用连接装置第3部分:直流充电接口》两项推荐性国家标准正式发布。新标准将最大充电电流从250安培提高至800安培、充电功
火辣西米秀 汽车电子
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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