一、可以使用的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; }
上一篇:4412 使用小度wifi
下一篇:4412 4路pwm输出
推荐阅读最新更新时间:2024-11-13 11:51
推荐帖子
- 图片渐进渐出效果
- 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安培、充电功
- 火辣西米秀 汽车电子
设计资源 培训 开发板 精华推荐
- 具有基于电容器的电源应用电路的单相电能表
- FEBFLS2100XS1CH_L12U160A,基于 FL7930B、FLS2100XS 的通用线路评估板上的 160W LED 驱动器
- LT1021BMH-10 具有全调整范围的精密电压基准的典型应用
- 2021年E题 数字-模拟信号混合传输收发机 -绿波电龙队
- LT8705AIUHF 用于电信稳压器的降压-升压型 DC/DC 控制器的典型应用
- DC1703A-B,用于 LTC2655BCUF-H16 四路 I2C 16 位电压输出 DAC 的演示板,具有 2.048V 基准
- 使用 Diodes Incorporated 的 ZR78L048 的参考设计
- 使用 STMicroelectronics 的 LM205H 的参考设计
- 基于 ST1PS03AQTR 400 mA 纳米静态同步降压转换器和负载开关的评估板
- 使用 ROHM Semiconductor 的 BD45331 的参考设计