完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
硬件分析
1.1 原理图分析 如下图所示,在底板原理图中找到 camera 扩展端子,这里以 VDD28_AF,VDD28_CAM 为例。camera 摄像头驱动中需要将其设置为 2.8v 的电压,后面我们将其修改为 3.3v 输出(需要去掉 camera 摄像头驱动)。 如下图所示,核心板原理图中搜索网络“VDD28_AF”和“VDD28_CAM”。可以看到“VDD28_AF”和“VDD28_CAM”分别对应电源芯片 S5M8767A 的“VLDO20”和“VLDO21”。 1.2 电源芯片 S5M8767A 的 datasheet 分析 S5M8767A 的 datasheet 的 2.3.1 小节,如下图所示。 如上图所示,注意红框中的内容。最上面的红框中,表示输出的电流是 150mA,最低输出电压是 0.8v,最大电压是 3.95v。下面红框中,介绍的是默认输出电压,可以看到 LDO20和 LDO21,默认输出的是 3.0v。 |
|
|
|
软件
如果要改变输出电压,可以通过修改平台文件实现;在驱动中,可以通过函数调用,控制电源输出。 通过前面的分析可知,ldo21 和 ldo20 输出电流范围是 0.8v 到 3.95v。 2.1 平台文件修改输出电压 在内核的“arch/arm/mach-exynos/mach-itop4412.c”文件中,如下图所示进行修改。 将REGULATOR_INIT(ldo20, “VDD28_CAM”, 2800000, 2800000, 0,REGULATOR_CHANGE_STATUS, 1); 注释掉,修改为 2800000,为 3950000(函数 REGULATOR_INIT 中的第一个参数表示8767 电源芯片的第 20 路,第三个参数表示输出最低电压,第四个参数表示输出最高电压)。这里设置为最低和最高全部为 3.95v。同理,我们将第 21 路也修改为 3950000,如上图所示。 接着在 menuconfig 中,将 ov5640 摄像头的驱动去掉,因为在摄像头中会初始化和配置。ov5640 摄像头摄像头的配置路径如下图所示。下面截图是已经去掉的截图,默认缺省文件是配置上的。 2.2 驱动例程 驱动例程“power_s5m8767a.tar.gz”和文档在同一压缩包中。 编写一个简单的驱动测试程序,源码如下所示。 #include #include #include #include #include #include #include #include #include #include #include #include struct regulator *ov_vddaf_cam_regulator = NULL; struct regulator *ov_vdd5m_cam_regulator = NULL; struct regulator *ov_vdd18_cam_regulator = NULL; struct regulator *ov_vdd28_cam_regulator = NULL; MODULE_LICENSE(“Dual BSD/GPL”); MODULE_AUTHOR(“iTOPEET_dz”); static int power(int flag) { if(1 == flag){ regulator_enable(ov_vdd18_cam_regulator); udelay(10); regulator_enable(ov_vdd28_cam_regulator); udelay(10); regulator_enable(ov_vdd5m_cam_regulator); //DOVDD DVDD 1.8v udelay(10); regulator_enable(ov_vddaf_cam_regulator); //AVDD 2.8v udelay(10); } else if(0 == flag){ regulator_disable(ov_vdd18_cam_regulator); udelay(10); regulator_disable(ov_vdd28_cam_regulator); udelay(10); regulator_disable(ov_vdd5m_cam_regulator); udelay(10); regulator_disable(ov_vddaf_cam_regulator); udelay(10); } return 0 ; } static void power_init(void) { int ret; ov_vdd18_cam_regulator = regulator_get(NULL, “vdd18_cam”); if (IS_ERR(ov_vdd18_cam_regulator)) { printk(“%s: failed to get %s/n”, __func__, “vdd18_cam”); ret = -ENODEV; goto err_regulator; } ov_vdd28_cam_regulator = regulator_get(NULL, “vdda28_2m”); if (IS_ERR(ov_vdd28_cam_regulator)) { printk(“%s: failed to get %s/n”, __func__, “vdda28_2m”); ret = -ENODEV; goto err_regulator; } ov_vddaf_cam_regulator = regulator_get(NULL, “vdd28_af”); if (IS_ERR(ov_vddaf_cam_regulator)) { printk(“%s: failed to get %s/n”, __func__, “vdd28_af”); ret = -ENODEV; goto err_regulator; } ov_vdd5m_cam_regulator = regulator_get(NULL, “vdd28_cam”); if (IS_ERR(ov_vdd5m_cam_regulator)) { printk(“%s: failed to get %s/n”, __func__, “vdd28_cam”); ret = -ENODEV; goto err_regulator; } err_regulator: regulator_put(ov_vddaf_cam_regulator); regulator_put(ov_vdd5m_cam_regulator); regulator_put(ov_vdd18_cam_regulator); regulator_put(ov_vdd28_cam_regulator); } static int hello_init(void) { power_init(); power(1); printk(KERN_EMERG “Hello World enter!/n”); return 0; } static void hello_exit(void) { power(0); printk(KERN_EMERG “Hello world exit!/n”); } module_init(hello_init); module_exit(hello_exit); Makefile 如下所示。 #!/bin/bash obj-m += power_s5m8767a_test.o KDIR := /home/topeet/android4.0/iTop4412_Kernel_3.0 PWD ?= $(shell pwd) all: make -C $(KDIR) M=$(PWD) modules clean: rm -rf *.o modules.order *.ko *mod.c Module.symvers 使用 make 命令编译驱动模块,如下图所示。 |
|
|
|
测试
如下图所示,加载驱动之后,测量电压大约为 2.85 左右(有压降),卸载驱动之后,电 压为 0。说明驱动运行成功,用户在自己的项目中,假如需要用到电源控制,可以参考本例程 来实现。 |
|
|
|
只有小组成员才能发言,加入小组>>
798 浏览 0 评论
1154 浏览 1 评论
2531 浏览 5 评论
2863 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2713 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1086浏览 3评论
195浏览 2评论
461浏览 2评论
374浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
455浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 00:31 , Processed in 1.143632 second(s), Total 84, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号