热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android从硬件到应用:一步一步向上爬1从零编写底层硬件驱动程序

硬件平台:TIAM335XStarterKit开发源码:TI-Android-ICS-4.0.3-DevKit-EVM-SK-3.0.1.bin主机系统:Ubuntu10.04

硬件平台:TI AM335X Starter Kit

开发源码:TI-Android-ICS-4.0.3-DevKit-EVM-SK-3.0.1.bin

主机系统:Ubuntu 10.04

       这次写《Android 从硬件到应用》是想尝试从底层的最简单的GPIO硬件驱动开始,一步一步的向上走,经过硬件抽象层HAL、JNI方法等,最终编写出APP,达到硬件调用的目的,期间会增加一些Android下C程序测试底层驱动的细节。既然是从零编写驱动,那就要脱离源码包里已有的一些api函数,从硬件电路开始。找到EVM板GPIO处原理图:

,

       我要控制LED D1的状态,如上图所示,D1接了Q4,也就是BSS138,N沟道的MOS器件,AM335X_GPIO_LED4为高电平时,Q4的栅极漏极导通,D1为亮,反之,灭。首先设置GPIO时钟:

,

一、CM_PER_GPIO1_CLKCTRL:地址0x44E000AC 要装载的值为 0x00040002

接着设置GPIO1输出使能:

,

二、GPIO_OE:地址0x4804C134 要装载的值为 0x0

然后设置输出GPIO1的输出:

,

三、GPIO_DATAOUT:地址0x4804C13C 要装载的值为 0x00000010或者是0x00000000,让AM335X_GPIO_LED4引脚为高或低,这样D1就可以亮灭

编写驱动程序 android_gpio.c:移到drivers/char目录下

#include   
#include   
#include   
#include  /* copy_to_user,copy_from_user */  
#include   
#include   
#include   
  
static struct class  *gpio_class;  
  
volatile unsigned long *DIR;  
volatile unsigned long *DAT; 
volatile unsigned long *CLK; 
  
int gpio_open (struct inode *inode,struct file *filp)  
  
{  
    *CLK = 0x00040002; //Enable
    *DIR = (*DIR)&0xffffffef;  //output  
    return 0;  
}  
  
ssize_t gpio_read (struct file *filp, char __user *buf, size_t count,loff_t *f_pos)  
{  
    return 0;  
}  
  
ssize_t gpio_write (struct file *filp, const char __user *buf, size_t count,loff_t *f_pos)  
{  
    char val_buf[2];  
    int ret;  
    ret = copy_from_user(val_buf,buf,count);  
          
    switch(val_buf[0])  
    {  
        case 0x31 :  
            *DAT = (*DAT)|0x00000010;  
            break;  
        case 0x30 :  
            *DAT = (*DAT)&0xffffffef;         
            break;  
        default :  
            break;  
    }  
    return count;  
}  
  
struct file_operations gpio_fops =  
{  
    .owner   = THIS_MODULE,  
    .open    = gpio_open,  
    .read    = gpio_read,  
    .write   = gpio_write,  
} ;  
  
int major;  
int gpio_init (void)  
{     
      
    major = register_chrdev(0,"Android_gpio",&gpio_fops);  
    gpio_class = class_create(THIS_MODULE, "Android_gpio");  
    device_create(gpio_class,NULL,MKDEV(major,0),NULL,"AdrIO");  
  
    DIR = (volatile unsigned long *)ioremap(0x4804C134,4);  
    DAT = (volatile unsigned long *)ioremap(0x4804C13C,4);  
    CLK = (volatile unsigned long *)ioremap(0x44E000AC,4);

    printk ("gpio is ready\n");  
    return 0;  
}  
  
void gpio_exit (void)  
{  
    unregister_chrdev(major,"Android_gpio");  
    device_destroy(gpio_class,MKDEV(major,0));  
    class_destroy(gpio_class);  
  
    iounmap(DIR);  
    iounmap(DAT);  
    iounmap(CLK);
  
    printk ("module exit\n");  
    return ;  
}  
  
MODULE_LICENSE("GPL");  
module_init(gpio_init);  
module_exit(gpio_exit); 
打开drivers/char目录下的Makefile,增加:

obj-$(CONFIG_ANDROID_GPIO)	+= android_gpio.o
打开drivers/char目录下的Kconfig,增加:

config ANDROID_GPIO
       tristate "android gpio enable"
       default y
源码目录下执行:

make ARCH=arm CROSS_COMPILE=arm-eabi- uImage

生成uImage,重新启动新系统,ls /dev 查看设备:

# ls /dev                                                      
AdrIO                                                                         
alarm                                                                          
android_adb                                                                
ashmem                                                                      
binder                                                                         
block                                                                           
bus 

发现AdrIO设备,第一步完成,注意在操作物理地址时一定要对位进行操作,不然

GPIO1会影响到AM335X Starter Kit的LCD显示,下一步就要执行C程序测试该驱动。

Android 从硬件到应用:一步一步向上爬 1 -- 从零编写底层硬件驱动程序


推荐阅读
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
author-avatar
LuoXR小堇_137
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有