0%

  Android编译过程详解之一
  Android编译过程详解之二
  Android编译过程详解之三
  Android.mk解析

ActivityNotFoundException

  最近将Android从4.4移植到5.1时,添加一个从拨号界面输入*#360*#进入battery info查看界面的功能时(如感兴趣,详情见Android电池监控系统(bms)之一电池系统架构),activity跳转部分代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
else if(input.equals(BATTERY_INFO))
{//added by lihuaqian
try {
ComponentName Component = new ComponentName("com.android.settings","com.android.settings.BatteryOemInfo");
Intent intent = new Intent();
intent.setComponent(Component);
intent.setAction(Intent.ACTION_VIEW);
context.startActivity(intent);
return true;
} catch (ActivityNotFoundException e) {
Log.d(TAG, "no activity to battery cmd.");
//e.printStackTrace();
}
}

  遇到如下问题:

1
  ActivityNotFoundException : Unable to find explicit activity class; have you declared this activity in your AndroidManifest.xml?
Read more »

**  Platform Information :
   System: Android4.4.4
   Platform: Qualcomm msm8916
   Author: Andy Lee
   Email: huaqianlee@gmail.com**

欢迎指出错误,共同学习,共同进步

  Android编译过程详解之一
  Android编译过程详解之二
  Android编译过程详解之三
  Android.mk解析
 
  Google给出的编译环境和构建方法见:http://source.android.com/source/initializing.html,过程见:http://source.android.com/source/building.html,不过这是解释怎么编译一个通用的系统,没有详细描述细节,而且需要翻墙。接下来我就准备跟着高通平台的编译过程来详细了解一下。

我平时的编译步骤如下:
 1. source setup.sh project-name debug/release 加载命令配置环境 
 2. ./go.sh [target] or make [target] 编译

Read more »

analysis log

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<3>[52515.763039] __smb135x_write: Writing 0x41=0x06
<3>[52515.774459] __smb135x_write: Writing 0x41=0x26
函数调用:
static int __smb135x_write(struct smb135x_chg *chip, int reg,u8 val)
->smb135x_write(struct smb135x_chg *chip, int reg,u8 val) / smb135x_masked_write(struct smb135x_chg *chip, int reg, u8 mask, u8 val)


<3>[52515.777868] fast_chg_handler: rt_stat = 0x00
<3>[52515.782184] usbin_uv_handler: chip->usb_present = 1 usb_present = 0
<3>[52515.788369] handle_usb_removal: setting usb psy type = 0
<3>[52515.793689] handle_usb_removal: setting usb psy present = 0
<3>[52515.799241] power_ok_handler: rt_stat = 0x00
<3>[52515.803472] src_detect_handler: chip->usb_present = 0 usb_present = 0
函数调用:
fast_chg_handler(struct smb135x_chg *chip, u8 rt_stat)
usbin_uv_handler(struct smb135x_chg *chip, u8 rt_stat)
handle_usb_removal(struct smb135x_chg *chip)
(->usbin_uv_handler(struct smb135x_chg *chip, u8 rt_stat)/usbin_ov_handler(struct smb135x_chg *chip, u8 rt_stat)/determine_initial_status(struct smb135x_chg *chip))
static struct irq_handler_info handlers[]=
{
...
{
.name = "fast_chg",
.smb_irq = fast_chg_handler,
},
{
.name = "usbin_uv",
.smb_irq = usbin_uv_handler,
},
...
}
->smb135x_irq_read(struct smb135x_chg *chip)
/static irqreturn_t smb135x_chg_stat_handler(int irq, void *dev_id)
->smb135x_chg_stat_handler(int irq, void *dev_id)
->smb135x_main_charger_probe(struct i2c_client *client,const struct i2c_device_id *id)

<3>[52515.809926] smb135x_chg_stat_handler: handler count = 4
<3>[52515.815104] smb135x_chg_stat_handler: batt psy changed
<3>[52515.820247] smb135x_chg_stat_handler: usb psy changed
<3>[52515.825260] smb135x_chg_stat_handler: dc psy changed
函数调用:
smb135x_chg_stat_handler(int irq, void *dev_id)
smb135x_external_power_changed(struct power_supply *psy)
-> smb135x_main_charger_probe(struct i2c_client *client,const struct i2c_device_id *id)/(force_irq_set(void *data, u64 val)/smb135x_resume(struct device *dev))

<6>[52515.836445] msm_hsusb msm_hsusb: CI13XXX_CONTROLLER_DISCONNECT_EVENT received
函数调用:
kernel/drivers/usb/chipidea/ci13xxx_msm.c:186: dev_info(dev, "CI13XXX_CONTROLLER_DISCONNECT_EVENT received\n");

<3>[52515.837146] smb135x_get_prop_batt_status: STATUS_4_REG=80
<3>[52515.841747] smb135x_get_prop_batt_status: STATUS_4_REG=80
函数调用:
smb135x_get_prop_batt_status(struct smb135x_chg *chip)
->smb135x_battery_get_property(struct power_supply *psy,enum power_supply_property prop,union power_supply_propval *val)/
smb135x_parallel_get_property(...)

<3>[52515.847405] smb135x_external_power_changed: current_limit = 0
函数调用:
smb135x_external_power_changed(struct power_supply *psy)

.....

driver architecture

the important structure

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
static struct i2c_driver smb135x_charger_driver = {
.driver = {
.name = "smb135x-charger",
.owner = THIS_MODULE,
.of_match_table = smb135x_match_table, // get the dtsi profile
.pm = &smb135x_pm_ops,
},
.probe = smb135x_charger_probe,
.remove = smb135x_charger_remove,
.id_table = smb135x_charger_id,
};
/*represent an I2C slave device*/
struct i2c_client {
unsigned short flags; /* div., see below */
unsigned short addr; /* chip address - NOTE: 7bit */
/* addresses are stored in the */
/* _LOWER_ 7 bits */
char name[I2C_NAME_SIZE];
struct i2c_adapter *adapter; /* the adapter we sit on */
struct i2c_driver *driver; /* and our access routines */
struct device dev; /* the device structure */
int irq; /* irq issued by device */
struct list_head detected;
};
struct i2c_device_id {
char name[I2C_NAME_SIZE];
kernel_ulong_t driver_data; /* Data private to the driver */
};

struct device_node {
const char *name;
const char *type;
phandle phandle;
const char *full_name;
...
}
struct smb135x_chg {
struct i2c_client *client;
struct device *dev;
struct mutex read_write_lock;
...
/* psy */
struct power_supply *usb_psy;
int usb_psy_ma;
struct power_supply batt_psy;
struct power_supply dc_psy;
struct power_supply parallel_psy;
struct power_supply *bms_psy;
...
}
struct power_supply {
const char *name;
enum power_supply_type type;
enum power_supply_property *properties;
...
int (*get_property)(...)
int (*set_property)(...)
... /* private */ struct device *dev;
...
}

driver analysis

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 注册驱动:
if (is_parallel_charger(client))
smb135x_parallel_charger_probe(client, id);
else
smb135x_main_charger_probe(client, id); // 驱动注册入口函数
chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL);
chip->client = client;
chip->dev = &client->dev; // get the dev
smb_parse_dt(chip) // parse DT nodes
usb_psy = power_supply_get_by_name("usb"); // get usb Supply
struct device *dev = class_find_device(power_supply_class, NULL, name,power_supply_match_device_by_name);
dev_get_drvdata(dev)
INIT_DELAYED_WORK(&chip->wireless_insertion_work,wireless_insertion_work);
smb135x_read(chip, CFG_4_REG, &reg) // probe the device to check if its actually connected
i2c_set_clientdata(client, chip); // client->...->driver_datat = chip
smb135x_chip_version_and_revision(chip) // judge the chip version(smb1357/1358....)
dump_regs(chip) // read and display the register's value
smb135x_regulator_init(chip) // initialize regulator(稳压器)
smb135x_hw_init(chip) // initialize hardware(初始化芯片各种参数)
determine_initial_status(chip) //determine init status
.../* initialize Battery power_supply*/
chip->batt_psy.get_property = smb135x_battery_get_property;
chip->batt_psy.set_property = smb135x_battery_set_property;
chip->batt_psy.external_power_changed = smb135x_external_power_changed; // register external power update online function
chip->batt_psy.property_is_writeable = smb135x_battery_is_writeable;
power_supply_register(chip->dev, &chip->batt_psy) // register Battery power Supply
....// get the profile and register the function
power_supply_register(chip->dev, &chip->dc_psy); // register dc psy
devm_request_threaded_irq(struct device *dev, unsigned int irq, irq_handler_t handler, irq_handler_t thread_fn,unsigned long irqflags,
const char *devname, void *dev_id) // allocate(分配) an interrupt line for a managed device
enable_irq_wake(client->irq); // control irq power management wakeup
create_debugfs_entries(chip); // create debug

  Git是Linux撞始人Linus Towards花一周写出来的分布式版本控制系统,大神终究是大神,这么牛逼的东西只需要一周。之前花了一百多刀买了Linus的原版自传《Just for fun》,基本上是他自己写的,很幽默,有兴趣可以看看。Linus很傲,但是傲得有资本,唯一能无视Jobs的现实扭曲力场,对Jobs的盛情邀请say no转身而去的人。 
 
  言归正传,Git十分好用,应用也十分广泛,现在最好的代码托管网站Github就是基于git创建的,而且现在大多数公司及个人都在使用它进行代码管理,要熟练使用还是需要花一些苦功夫的,我现在也还只是会基本的应用,更深层次的使用还不熟悉。为了方便自己以后使用,将自己常用的一些命令加以总结,并Google了一些常用及进阶命令,一并列出,方便查询使用。

最重要的命令: git –help

Read more »

Platform Information :
 System: Android4.4.4
 Platform: Qualcomm msm8916
 Author: Andy Lee
 Email: huaqianlee@gmail.com

如有错误欢迎指出,共同学习,共同进步
 
  电池对移动设备的重要性不言而喻,所以电池监控系统也是Android的重中之重。今天就结合工作中的内容来分析一下电池监控系统。
##电池系统架构
  Android中的电池使用方式包括AC(即电源适配器)、Wireless(无线充电)、USB、Battery 等不同的模式。在APP层,通常包括电池状态显示等功能。在framework层 ,主要包括从底层获取电池信息、电池管理、LED控制、绘制更新充电图标等功能。因此,bms主要负责电池状态信息读取和更新相应状态。其架构如下: 
 
  电池系统架构

自上而下,Android电池监控系统分为如下几个部分:

###电池信息查看APP
  此部分主要是指查看电池信息的APP,比如电池医生、手机内置的电池信息查看APP等。这里就用工作的为例,在拨号状态下输入*#360*#,则会打开电池信息查看APP。如下所示:

Read more »

  对于移动设备,电源管理是相当重要的一部分,因为现在在公司主要负责电源管理部分,所以借用Google对其研究了一下,再结合自己的工作经验,准备接下来写一系列相关的文章。因为现在还研究得不够,所以最初的文章会不够深入。不过我会慢慢研究,然后写一些比较详细的解读。

高通的引导体系结构

boot
SBL- Second BootLoader

Read more »

  前些时间把Android Studio的环境折腾好,典型的geek风一下子完全吸引了我,比eclipse好用太多了,有很多意外的功能,快捷键可以自定义,但我基本都用的默认的。或许用Macbook Pro做Android开发是最好的选择,但自己平时要搞Linux/Android底层相关的东西,thinkpad就成为最好的选择,所以就入手了thinkpad,用着Ubuntu和Windows,先总结我使用环境下的快捷键。

Read more »

  因之前工作需要在kernel里存取数据到文件中,特意研究了一下怎么做,我们应尽可能避免直接操作文件I/O,选择通过调用VFS(虚拟文件系统)的函数来实现,我的实现demo如下:

##Includes

1
2
3
4
#include <linux/fs.h>
#include <asm/segment.h>
#include <asm/uaccess.h>
#include <linux/buffer_head.h>

##Opening a file

Read more »