通过 实战一 的设置GPS的通讯已经通了,问题是 GPS 的电源控制还没有实现。
希望在 android 打开 GPS 的时候才打开电源,关闭 GPS 时关闭电源。
就得增加 GPS 电源控制的节点。
制作 GPS_POWER 节点源文件。
根据 GPIO 实例做 gps_power.c 文件,我的文件内容如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define DEVICE_NAME "gps_power"
static int gps_power_ioctl(
struct inode *inode,
struct file *file,
unsigned int cmd,
unsigned long arg)
{
return 0;
}
static int gps_power_open(struct inode *inode, struct file *filp)
{
int i;
printk (DEVICE_NAME": open
");
gpio_set_value(S5PV210_GPJ1(0),1);
return 0;
}
static ssize_t gps_power_read(struct file *filp, char __user *buffer, size_t count, loff_t *ppos)
{
printk (DEVICE_NAME": read
");
return 0;
}
static int gps_power_release(struct inode *inode, struct file *filp)
{
printk (DEVICE_NAME": release
");
gpio_set_value(S5PV210_GPJ1(0),0);
return 0;
}
static struct file_operations dev_fops = {
.owner
= THIS_MODULE,
.ioctl
= gps_power_ioctl,
.open =gps_power_open,
.read =gps_power_read,
.release=
gps_power_release,
};
static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &dev_fops,
};
static int __init dev_init(void)
{
int ret;
s3c_gpio_cfgpin(S5PV210_GPJ1(0), S3C_GPIO_SFN(1));
s3c_gpio_setpull(S5PV210_GPJ1(0),S3C_GPIO_PULL_NONE);
gpio_set_value(S5PV210_GPJ1(0),0);
ret = misc_register(&misc);
printk (DEVICE_NAME":init
");
return ret;
}
static void __exit dev_exit(void)
{
printk (DEVICE_NAME":exit
");
gpio_set_value(S5PV210_GPJ1(0),0);
misc_deregister(&misc);
}
module_init(dev_init);
module_exit(dev_exit);
MODULE_LICENSE("GPS");
MODULE_AUTHOR("Payen");
修改 makefile 增加 gps_power.c
这样编译内核后在目标板 dev/ 目录下就有 gps_power 的节点了。
然后修改android HAL 层GPS文件 gps_qemu.c 打开设备。
#define GPS_Power_Ctrl "/dev/gps_power"
static void gps_state_init( GpsState* state ) 打开设备
state->fPower = open(GPS_Power_Ctrl, 0 );
if (state->fPower < 0) {
D("gps Open power %s fail %d
",GPS_Power_Ctrl,state->fPower);
state->init = 0;
close(state->fd);
state->fd = -1 ;
return;
}
static voidgps_state_done( GpsState* s ) 关闭设备
close( s->fPower ); s->fPower = -1;
到这里发现 打开设备失败,找了 gps_power 节点,发现节点存在啊~!
看看 节点权, 发现是 CRW ,改权限试试,把权限改成 777
再打开 节点。
这时候GPS电供上了
关闭节点 GPS 电关闭了。
控制部分已经完成了,最后要把这个设置权限放到系统 init.rc 里面
device/samsung/smdkv210/init.rc
增加
chmod 0777 /dev/gps_power
一切搞定。