Android各代码层获取系统时间的方法 获取链接 Facebook X Pinterest 电子邮件 其他应用 八月 07, 2017 在Android系统里,各代码层如何去获取系统时间呢?可分别调用如下函数来获取: 在java层,可以使用方法:long now = SystemClock.uptimeMillis(); 在native层,可以使用方法:nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC); 在驱动层,可以使用方法:s64 time = ktime_to_us(ktime_get()); 获取链接 Facebook X Pinterest 电子邮件 其他应用 评论
I/O映射之I/O端口 七月 29, 2018 对于外设,操作系统会采用端口映射和内存映射两种方式来对其进行控制,其中端口映射就是操作系统规定好一段地址给指定换上设,其与外设的寄存器按顺序一一对应上。 在Linux内核源码include/asm-generic/io.h头文件里有如下我们对I/O port进行操作的函数: static inline u8 inb(unsigned long addr) { return readb(addr + PCI_IOBASE); } static inline u16 inw(unsigned long addr) { return readw(addr + PCI_IOBASE); } static inline u32 inl(unsigned long addr) { return readl(addr + PCI_IOBASE); } static inline void outb(u8 b, unsigned long addr) { writeb(b, addr + PCI_IOBASE); } static inline void outw(u16 b, unsigned long addr) { writew(b, addr + PCI_IOBASE); } static inline void outl(u32 b, unsigned long addr) { writel(b, addr + PCI_IOBASE); } #define inb_p(addr) inb(addr) #define inw_p(addr) inw(addr) #define inl_p(addr) inl(addr) #define outb_p(x, addr) outb((x), (addr)) #define outw_p(x, addr) outw((x), (addr)) #define outl_p(x, addr) outl((x), (addr)) 分别对应对端口进行读取或写入字节、字、双字大小数据的操作。 该头文件中还有其他的操作函数及宏定义,请自行深入了解。 我们可通过读取/proc/ioports文件来了解Linux里I/O端口的映射... 阅读全文
制作Android7.1关机充电动画 一月 18, 2019 在Android7.1系统上面,关机充电动画已不再是5.1里的几张图片,如下: 在Android5.1的system/core/healthd/images目录下,有如下文件: battery_0.png battery_1.png battery_2.png battery_3.png battery_4.png battery_5.png battery_charge.png battery_fail.png capacity_text_bottom.png capacity_text_left.png capacity_text_right.png capacity_text_top.png 而在Android7.1的同一目录下,则只有如下文件: battery_fail.png battery_scale.png 其中,battery_scale.png为相应的动画文件,我们查找了一翻,发现在bootable/recovery目录下有interlace-frames.py文件,该文件用于将几张PNG图片合成一张PNG图片,我们使用如下命令将上面的battery_scale.png解包: python interlace-frames.py -d battery_scale.png -o battery.png 会生成battery00.png、……、battery05.png共6个文件,而这6个文件刚好对应system/core/healthd/healthd_mode_charger.cpp文件里的default_animation_frames定义: static ... 阅读全文
通过Netlink检测网线插拔 一月 10, 2017 最近有个需求需要检测RJ45网卡的网线有没有接上,而最近正在了解Netlink相关资料,刚好也看下通过Netlink可以进行检测,故在此做下粗略笔记: 1.首先要创建一个Netlink Socket,在用户层使用如下参数来调用socket()函数: fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); 上面这个函数第一个参数必须是AF_NETLINK或PF_NETLINK,这两个标志在Linux下是一样的,第二个参数可以是SOCK_RAW或SOCK_DGRAM(对应用到TCP或UDP协议),而最后一个参数NETLINK_ROUTE为“路由守护进程”,用于接收来自内核的路由通知事件。 2.将上面创建的Socket绑定 addr.nl_family = AF_NETLINK; addr.nl_groups = RTNLGRP_LINK; //指定接收路由多播组消息 bind(fd, (struct sockaddr*)&addr, sizeof(addr)); 上面将创建的socket与相应的协议族和组进行绑定,接下来通过读fd这个socket来获得相应的消息数据struct nlmsghdr,再对该结构体数据进行判断来获得网线是接上或是拔掉,相应的源码如下: #include <sys/types.h> #include <sys/socket.h> #include <asm/types.h> #include <linux/netlink.h> #include <linux/rtnetlink.h> #include <stdlib.h> #include <stdio.h> #include <sys/ioctl.h> #include <linux/if.h> #include <st... 阅读全文
评论
发表评论