安卓LED驱动开发体验

来源:互联网 发布:杜兰特官方体测数据 编辑:程序博客网 时间:2024/06/06 05:15

我们怎么将PC上的程序放到安卓设备上,这里给大家讲一个软件ADB

ADB采用的是USB的硬件链路,硬件链路还有网线的。

在我们PC上运行一个ADB的客户端程序,然后在我们安卓设备上运行我们adb的服务端程序

有了客户端程序之后,我们可以利用客服端程序非常轻松的把我们想传到安卓设备上面的文件通过USB链路传到安卓设备上面去

我们下面就讲如何用ADB传文件

先插上你的安卓设备的下载线

然后在ubuntu下面连接上,在我们以前装的那个ANDROIDSDK下面有个adb工具

位置截图如下


这里博主经过很多次实验 还是打算自己安装一个adb

然后修改配置,过程如下

首先安装

sudo apt-get install android-tools-adb

然后lsusb查看你插入安卓手机的ID

我的ID如下


第一个就是我的安卓设备。

然后创建一个文件,如下

sudo vi /etc/udev/rules.d/70-android.rules

在里面加入这一行


这里读者不要照着我的填,按自己安卓设备实际情况把这个东西填上去。

然后修改权限

sudo chmod a+rx /etc/udev/rules.d/70-android.rules

然后重启udev 服务

sudo service udev restart

然后重启adb server。

重连设备,然后执行sudo ./adb kill-server

adb start-server

我不也不知道是不是因为这个原因,反正博主本人就实现了

然后输入命令如下图


push只把我们的文件传到我们开发板上面去,led.ko是指你要传的文件的名字,然后后面/data是指你要传到开发板上的目录


然后他会很快告诉你文件传完了,在我们开发板上也可以看见


就可以看到我们的led.ko了


我们先来看看我们makefile


KDIR是我们内核的目录,然后驱动程序如下

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/device.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <linux/cdev.h>


#define LED_CONFIG 0xe0200280
#define LED_DATA 0xe0200284


#define LED_MAGIC 'L'
#define LED_ON _IO(LED_MAGIC,0)
#define LED_OFF _IO(LED_MAGIC,1)


unsigned int *led_config;
unsigned int *led_data;


struct cdev cdev;
dev_t devno;


#define DRIVER_NAME "led_driver"
struct class *my_class;


static int led_open(struct inode *inode,struct file *file)
{
led_config=ioremap(LED_CONFIG,4);
writel(0x00001111,led_config);
led_data=ioremap(LED_DATA,4);
return 0;
}


static int led_close(struct inode *inode,struct file *file)
{
iounmap(led_config);
iounmap(led_data);
return 0;


}


long led_ioctl(struct file *file,unsigned int cmd,unsigned long arg)
{

switch(cmd)
{
case LED_ON:
writel(0x00,led_data);
break;
case LED_OFF:
writel(0x0f,led_data);
break;
default:
return -EINVAL;
}

return 0;
}


static struct file_operations led_fops=
{
.owner =THIS_MODULE,
.open = led_open,
.release = led_close,
.unlocked_ioctl = led_ioctl,


};


static int led_init(void)
{
cdev_init(&cdev,&led_fops);
alloc_chrdev_region(&devno,0,1,"myled");
cdev_add(&cdev,devno,1);
my_class = class_create(THIS_MODULE,"led_class");
if(IS_ERR(my_class))
{
printk("ERR : failed in creating class\n");
return -1;
}
device_create(my_class,NULL,devno,NULL,DRIVER_NAME);
return 0;
}


static void led_exit(void)
{
device_destroy(my_class,devno);
class_destroy(my_class);

cdev_del(&cdev);
unregister_chrdev_region(devno,1);
}




module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("EIGHT");


然后我们进入我们第二步

先找到一个压缩包


然后解压,输入命令

unzip android-ndk-r11c-linux-x86_64.zip 

解压完之后把这个环境路径添加到外面系统环境路径下面去

如图


然后启动我们环境变量

source /etc/profile

我们先拿别人的安卓驱动的应用程序改,以后牛逼了自己写

这里我们要修改一个路径

vim local.properties


将这个SDK的路径 因为我们安卓的应用程序需要用到我们安卓的SDK,所以这里要指明你安卓SDK放到那个地方的,然后第二个路径是我们NDK的路径,

我们在后面会将NDK的开发,这个NDK实际上是一个开发包,这也是我们要用到的,把这两个路径改好之后启动我们androidstudio

studio.sh

studio启动之后我们选择file->new->import projiect



如上图

它就导入我们工程

然后编译


这里他会让你选择你这个程序是要下载到什么地方去运行,这里已经列出了我们开发板的平台。

然后烧进去就可以了


我们NDK驱动,由两部分构成的,第一是内核级别的LED驱动

第二个部分就是测试的APP构成的



我们框架模型的LED驱动

第一步就是编译我们内核级别的LED驱动,跟上面的一样的。

第二步就是那别人的HAL目录改

先改目录,将脚本改下


第一个是我们安卓源代码,其他的照着你的改就行了,如下就是博主本人的


然后./build.sh

输出信息如下图


首先会编译出一个文件,编译出来的文件位于我们安卓源代码目录下的out/target/product/gec210/system/lib/hw/led_hal.default.so这个文件

然后他会通过ADB传到我们开发板上面去

这是我们第二步,好像有个hal相关的软件

第三部,这里暂时也是用别人的代码改一下


编译之前改路劲


这里传了led_hal_jni.so

所以第三部是个JNI的软件

这就是框架型的驱动的构成

有没有第四个呢,接着做


然后你看一下build.sh ,你可以看到没有什么要改

 完成之后我们进入我们下一项

这一项你可以看名字发现是service相关的,所以这里是service软件


第五项


我们要把四步生成的LedHalService.jar考到这个目录的app/libs下面来

改一下local.properties中androidstdio的路径

然后启动我们androidstdio

向上面一样导入工程就可以了

这就是我们第五项