前一篇文章写了高通平台对于寄存器底层读取的支持,
这篇文章描述下如何在没有此工具的情况下,如何自己编译一个驱动程序读取寄存器值
工具的原理很简单,Linux 应用层无法直接访问内核空间,使用通过上层应用打开驱动,然后往驱动写值,来通过驱动去访问底层硬件
驱动中我们实现ioctl函数,相对于open 和write, ioctl 更具灵活性
static long debugs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
int ret;
switch(cmd){
case GET_VALUE:
ret = get_register(arg); //读取寄存器值
if (ret < 0 )
return -1;
break;
case SET_VALUE:
ret = set_register(arg); // 设置寄存器值
if (ret < 0 )
return -1;
break;
default:
printk("Unknown cmd\n");
}
return 0;
}
ioctl实现读和写
读函数:
int get_register(unsigned long arg)
{
int ret ;
ret = copy_from_user(®iste,(void * )arg , sizeof (registe)); // 拷贝用户空间传入的值
if(ret)
return -EFAULT; //错误判断
printk( " kernel get addr form user \n");
// 分配内核地址,讲具体寄存器地址映射到内核空间