当前位置:首页 » 编程软件 » android编译lk

android编译lk

发布时间: 2022-05-27 20:35:16

Ⅰ android bootloader lk阶段能读取文件吗

1.主要功能,红色部分是android特有的一些功能,如fastboot,recovery模式等:
* Variety of nand devices for bootup
* USB driver to enable upgrading images over usb ring development
* Keypad driver to enable developers enter ‘fastboot’ mode for image upgrades
* Display driver for debugging and splash screen
* Enable Android recovery image and image upgrades

2.配置dram内存大小,供linux kernel使用
The memory tags can be customized inlk/target/<target_name>/atags.c

3.fastboot模式,可以自行打开或者关闭
如,在boot中关闭按键或者usb 驱动,都可以达到此目的
相关文件
k/app/aboot/fastboot.c
lk/app/aboot/aboot.c

4.MTD block setting
可以配置各个mtd image 分区在如下 文件中
lk\target\tcc8900_evm\init.c
static struct ptentry board_part_list[]

5.打开或者关闭splash screen in the bootloader
DISPLAY_SPLASH_SCREEN功能可以来打开关闭
开机时候,boot会从’splash’ MTD分区中读取原始的文件到framebuffer中显示,所以也需要加载display 的驱动
入口函数在 kernel/main.c 中的 kmain(), 以下就来读读这一段 code.

void kmain(void)
{
// get us into some sort of thread context
thread_init_early();
// early arch stuff
arch_early_init();
// do any super early platform initialization
platform_early_init();
// do any super early target initialization
target_early_init();
dprintf(INFO, "welcome to lk/n/n");

// deal with any static constructors
dprintf(SPEW, "calling constructors/n");
call_constructors();
// bring up the kernel heap
dprintf(SPEW, "initializing heap/n");
heap_init();
// initialize the threading system
dprintf(SPEW, "initializing threads/n");
thread_init();
// initialize the dpc system
dprintf(SPEW, "initializing dpc/n");
dpc_init();
// initialize kernel timers
dprintf(SPEW, "initializing timers/n");
timer_init();
#if (!ENABLE_NANDWRITE)
// create a thread to complete system initialization
dprintf(SPEW, "creating bootstrap completion thread/n");
thread_resume(thread_create("bootstrap2", &bootstrap2, NULL, DEFAULT_PRIORITY, DEFAULT_STACK_SIZE));
// enable interrupts
exit_critical_section();
// become the idle thread
thread_become_idle();
#else
bootstrap_nandwrite();
#endif
}

In include/debug.h: 我们可以看到 dprintf 的第一个参数是代表 debug level.

/* debug levels */
#define CRITICAL 0
#define ALWAYS 0
#define INFO 1
#define SPEW 2
In include/debug.h:

view plainprint?
#define dprintf(level, x...) do { if ((level) <= DEBUGLEVEL) { _dprintf(x); } } while (0)

所以 dprintf 会依 DEBUGLEVEL 来判断是否输出信息.

来看第一个 call 的函数: thread_init_early, define in thread.c

view plainprint?
void thread_init_early(void)
{
int i;
/* initialize the run queues */
for (i=0; i < NUM_PRIORITIES; i++)
list_initialize(&run_queue[i]);
/* initialize the thread list */
list_initialize(&thread_list);
/* create a thread to cover the current running state */
thread_t *t = &bootstrap_thread;
init_thread_struct(t, "bootstrap");
/* half construct this thread, since we're already running */
t->priority = HIGHEST_PRIORITY;
t->state = THREAD_RUNNING;
t->saved_critical_section_count = 1;
list_add_head(&thread_list, &t->thread_list_node);
current_thread = t;
}

#define NUM_PRIORITIES 32 in include/kernel/thread.h

list_initialize() defined in include/list.h: initialized a list

view plainprint?
static inline void list_initialize(struct list_node *list)
{
list->prev = list->next = list;
}

run_queue 是 static struct list_node run_queue[NUM_PRIORITIES]

thread_list 是 static struct list_node thread_list

再来要 call 的函数是: arch_early_init() defined in arch/arm/arch.c

view plainprint?
void arch_early_init(void)
{
/* turn off the cache */
arch_disable_cache(UCACHE);
/* set the vector base to our exception vectors so we dont need to double map at 0 */
#if ARM_CPU_CORTEX_A8
set_vector_base(MEMBASE);
#endif
#if ARM_WITH_MMU
arm_mmu_init();
platform_init_mmu_mappings();
#endif
/* turn the cache back on */
arch_enable_cache(UCACHE);
#if ARM_WITH_NEON
/* enable cp10 and cp11 */
uint32_t val;
__asm__ volatile("mrc p15, 0, %0, c1, c0, 2" : "=r" (val));
val |= (3<<22)|(3<<20);
__asm__ volatile("mcr p15, 0, %0, c1, c0, 2" :: "r" (val));
/* set enable bit in fpexc */
val = (1<<30);
__asm__ volatile("mcr p10, 7, %0, c8, c0, 0" :: "r" (val));
#endif
}

现代操作系统普遍采用虚拟内存管理(Virtual Memory Management)机制,这需要处理器中的MMU(Memory Management Unit,
内存管理单元)提供支持。
CPU执行单元发出的内存地址将被MMU截获,从CPU到MMU的地址称为虚拟地址(Virtual Address,以下简称VA),而MMU将这个地
址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将VA映射成PA
MMU将VA映射到PA是以页(Page)为单位的,32位处理器的页尺寸通常是4KB。例如,MMU可以通过一个映射项将VA的一页
0xb7001000~0xb7001fff映射到PA的一页0x2000~0x2fff,如果CPU执行单元要访问虚拟地址0xb7001008,则实际访问到的物理地
址是0x2008。物理内存中的页称为物理页面或者页帧(Page Frame)。虚拟内存的哪个页面映射到物理内存的哪个页帧是通过页
表(Page Table)来描述的,页表保存在物理内存中,MMU会查找页表来确定一个VA应该映射到什么PA。

操作系统和MMU是这样配合的:

1. 操作系统在初始化或分配、释放内存时会执行一些指令在物理内存中填写页表,然后用指令设置MMU,告诉MMU页表在物理内存中
的什么位置。
2. 设置好之后,CPU每次执行访问内存的指令都会自动引发MMU做查表和地址转换操作,地址转换操作由硬件自动完成,不需要用指令
控制MMU去做。

MMU除了做地址转换之外,还提供内存保护机制。各种体系结构都有用户模式(User Mode)和特权模式(Privileged Mode)之分,
操作系统可以在页表中设置每个内存页面的访问权限,有些页面不允许访问,有些页面只有在CPU处于特权模式时才允许访问,有些页面
在用户模式和特权模式都可以访问,访问权限又分为可读、可写和可执行三种。这样设定好之后,当CPU要访问一个VA时,MMU会检查
CPU当前处于用户模式还是特权模式,访问内存的目的是读数据、写数据还是取指令,如果和操作系统设定的页面权限相符,就允许访
问,把它转换成PA,否则不允许访问,产生一个异常(Exception)

常见的 segmentation fault 产生的原因:
用户程序要访问一段 VA, 经 MMU 检查后无权访问, MMU 会产生异常, CPU 从用户模式切换到特权模式, 跳转到内核代码中执行异常服务程序.
内核就会把这个异常解释为 segmentation fault, 将引发异常的程序终止.

Ⅱ C语言高手请进,结构体里的元素前面有一点“.”代表什么意思比如 .goodvar

前面不加点也可以赋值,加 “.”的话可以不考虑赋值顺序,比如可以先给resolution赋值,在给output赋值,可以写成这样:
struct atag_tcc_entry tcc_param = {
.resolution = 0,
.output = 0,
}
原理就是因为加 “.”就表示在这个结构体中选择这个变量来赋值,所以可以不考虑结构体中变量的顺序
不加"."的话赋值可以直接写
struct atag_tcc_entry tcc_param = {
0, 0,
}
这样就必须要按照顺序来赋值了

Ⅲ 请问android uboot 和 little kernel是什么关系

android uboot平台更多 高通用的little krenel 可以看做是uboot 里的一部分 类似一个小操作系统来引导 反正我是这么理解的

Ⅳ android studio 引用aar怎么编译不了

1、 简述
在比较大的 Android 项目的开发中,我们经常会遇到工程、jar 包等等之间相互引用的方式。一般我们通过在 gradle 文件中配置依赖来解决,比如:
<img alt="通用配置" src="http://www.2cto.com/uploadfile/Collfiles/20150519/20150519085924119.png" title="" http:="" www.2cto.com="" kf="" ware="" vc="" "="" target="_blank" class="keylink" style="padding: 0px; margin: 0px auto; list-style: none; display: block; width: 630px; height: 198.454680534918px;">++o7q9q8SzuPbEv8K8z8LL+dPQt/u6z8Cp1bnD+7XEzsS8/tf3zqrSwMC1o7sgPGNvZGU+M8L2NvZGU+TWF2ZW5gIL/i1/fOqtLAwLWju9TaIE1hdmVuIL/i1tDQxCC/ydLUy9HL99fUvLrP69PDtcS/4r340NDSwMC1o7sgPGNvZGU++/Nf3zqrSwMC1oaMNCjxwPr+CIMG9uPa5pLPMo6zP682syrHS/+NXiuPYgTW9kdWxlIL//vNKqtbzI6yBDo6y2+++YWFyPC9jb2RlPiC/4rXEtPKw/Le9yr2jrM7Sw8e/++/="2aar-文件简介">2、aar 文件简介
要输出 aar 文件,必须将 Mole 配置为 library,在 gradle 文件中如下:
输出 aar : apply plugin: 'com.android.library'; 输出 apk :apply plugin: 'com.android.application'。
将 Mole 配置为 library 后,构建输出一个 aar 文件,根据渠道和 BuildType 的不同,在相应的目录下可以找到。比如对 BuildType 为 debug 的配置,输出为:[MoleName]/build/outputs/aar/[MoleName]-debug.aar。一份 aar 文件其实就是一份 zip 包,和 jar 不同的是,它将一些资源文件、第三方库文件、so 文件等等都打包在内,而代码文件编译后压缩在在 classes.jar 中。比如:

3、导入 aar 的方式引用
这种方式比较简单,打开 Project Structure,添加一个新 Mole,然后选择 Import *.JAR or *.AAR Package 的方式导入:

导入后,在你的工程下面,会生成一个文件夹,里面是 aar 文件以及 Android Studio 的配置文件。

接着可以在 gradle 中配置依赖了,其他 Mole 可以引用这个 Mole 了,依赖方式使用compile project 的方式即可。
缺点:被依赖的 aar 无法 F3 跟进去,无法看到资源文件内容以及目录层级等等缺陷。
4、使用配置依赖的方式引用
gradle 其实还有另一种依赖可以引用 aar:
compile(name: 'xxx', ext: 'aar')。
首先需要将 aar 文件放入引用 Mole 的 libs 目录下,和一般的 jar 文件类似。然后在 gradle 配置文件中把 libs 目录加入依赖:
?

1
2
3
4
5

<code class="hljs bash">repositories {
flatDir {
dirs 'libs'
}
}</code>


接着在 gradle 的依赖配置中加入 compile(name: 'xxx', ext: 'aar') 这一句,依赖即可关联完毕。构建一下工程,在 Mole 的 build/intermediates/exploded-aar 目录下,可以看到有一些临时文件生成:

看起来完全是引用 aar 的解压版本。Android Studio 安装反编译插件后,可以通过 F3 跟进到 class 文件里面,如果你有被依赖 Mole 的源代码的话,还可以 Attach Source 关联源代码查看。另外,可以很方便的查看 aar 中的资源文件。
另外,这种依赖方式更新 aar 后,生成的临时文件也会随之变动,不用担心改动不同步的问题。
5、总结
综上,介绍了 aar 文件的生成方式,以及两种 aar 依赖的方式,经过实战检验,第二种通过配置 gradle 依赖的方式简单易用,只需一行代码即可搞定。

Ⅳ lk是什么意思

lk是like的缩写。

like

英 [laɪk] 美 [laɪk]

prep. 像

conj. 如同

adv. 大概;和......一样

adj. 相似的;同样的

v. 喜欢;想;愿意

n. 类似的人或物

At a distance he looks a bit like James Bond.

从远处看,他有点像詹姆斯·邦德。

近义词

fancy核心词汇

英 ['fænsi] 美 ['fænsi]

adj. 华丽装饰的;复杂的;引人注目的;时髦的;昂贵的;好的

n. 喜爱;幻想;想象力

vt. 想象;希望;迷恋

I have taken a fancy to that new bicycle.

我非常喜欢那辆新自行车。

Ⅵ 大家在android下集成的无线网卡,都是些什么

android平台下默认支持TI公司的WIFI模块,LINUX下有BOARDCOM的几个WIFI芯片(BCM43XX系列)的驱动.
1、在你的BoardConfig.mk文件中增加一行(根据你的无线网卡类型来设置):

1: BOARD_WPA_SUPPLICANT_DRIVER := WEXT
2、在你的board配置目录下创建一个wpa_supplicant.conf文件,输入如下内容:

1: ctrl_interface=DIR=/data/system/wpa_supplicant
2: update_config=1
3、网络驱动模块ko文件到你的board配置目录下,下文假设网卡驱动模块为LK_DRV_USB_RTL8192.ko。

4、修改board配置目录下的AndroidBoard.mk,增加如下代码:

1: file := $(TARGET_OUT)/lib/moles/LK_DRV_USB_RTL8192.ko
2: ALL_PREBUILT += $(file)
3: $(file) : $(LOCAL_PATH)/LK_DRV_USB_RTL8192.ko | $(ACP)
4: $(transform-prebuilt-to-target)
5:
6: file := $(TARGET_OUT_ETC)/wifi/wpa_supplicant.conf
7: ALL_PREBUILT += $(file)
8: $(file) : $(LOCAL_PATH)/wpa_supplicant.conf | $(ACP)
9: $(transform-prebuilt-to-target)
5、修改hardware/libhardware_legacy/wifi/wifi.c文件。

重新定义WIFI_DRIVER_MODULE_PATH和WIFI_DRIVER_MODULE_NAME宏,定义如下:

1: #ifndef WIFI_DRIVER_MODULE_PATH
2: #define WIFI_DRIVER_MODULE_PATH "/system/lib/moles/LK_DRV_USB_RTL8192.ko"
3: #endif
4: #ifndef WIFI_DRIVER_MODULE_NAME
5: #define WIFI_DRIVER_MODULE_NAME "LK_DRV_USB_RTL8192"
6: #endif
6、修改init.rc文件,修改如下:

1: chmod 0771 /system/etc/wifi wifi wifi
2: chmod 0660 /system/etc/wifi/wpa_supplicant.conf
3: chown wifi wifi /system/etc/wifi/wpa_supplicant.conf
4: mkdir /data/misc/wifi 0771 wifi wifi
5:
6: mkdir /data/misc/wifi/sockets 0771 wifi wifi
7: # wpa_supplicant socket
8: mkdir /data/system/ 0771 system system
9: mkdir /data/system/wpa_supplicant 0771 wifi wifi
10:
11: mkdir /data/misc/dhcp 0771 system system
12:
13: setprop wifi.interface wlan0
14:
15: ice wpa_supplicant /system/bin/wpa_supplicant -dd -Dwext -iwlan0 -c /system/etc/wifi/wpa_supplicant.conf
16: group system wifi inet
17: disabled
18: oneshot
19:
20: ice dhcpcd /system/bin/dhcpcd wlan0
21: group system dhcp
22: disabled
23: oneshot
注意如果有问题,请给各个目录设置为777属性,把文件设置为666的文件属性试试。

7、最好是clean掉,全部重新编译。享受终于可以享受wifi了!

Ⅶ QVector<QVector<cv::Point>> lk; qt平台中报错 怎么解决

声明lk时要在两个“>”之间加一个空格,否则与“>>”运算符相同了,编译器就认为是“>>”运算符了;也就是把声明语句改为:

QVector<QVector<cv::Point>>lk;

Ⅷ 如何写android或linux内核可加载模块

hello.c
/* hello.c */
#include <linux/init.h>
#include <linux/mole.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("tang");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world/n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, hello/n");
}
mole_init(hello_init);
mole_exit(hello_exit);
----------------------------------------------------------------------------
Makefile
/* Makefile*/
PWD := $(shell pwd)
KVER := $(shell uname -r)
KDIR := /lib/moles/$(KVER)/build
obj-m:=hello.o
all :
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD)
.PHONY : clean
clean :
rm -rf .*.cmd *.mod.c *.o *.ko .tmp_versions

linux下可以make编译,希望对你有帮助!

Ⅸ android 需要codegen.dws么

1. 在Android L版本上 DCT tool配置的codegen.dws文件在preloader、lk、kernel中是独立的,被分开放置,其路径如下:

preloader:
alps\bootable\bootloader\preloader\custom\$(proj)\dct\dct\codegen.dws
lk:
alps\bootable\bootloader\lk\target\$(proj)\dct\dct\codegen.dws
kernel:
alps\kernel-3.10\arch\arm\mach-$(platform)\$(proj)\dct\dct\codegen.dws
or
alps\kernel-3.10\drivers\misc\mediatek\mach\$(platform)\$(proj)\dct\dct\codegen.dw

Ⅹ 如何编译预置obj 文件

1. 如何在preloader 中预置obj 文件?
Branch: GB, GB2, ICS, ICS2, JB, JB2
Step1. 首先获取obj 文件,如果是preloader 已有的Source code 需要预置为obj 文
件,那么可到如下路径获取obj 文件:mediatek/[source]/preloader/out
Step2. 在mediatek/[source]/preloader 目录下创建文件夹:myobjs,将Step1 中获取
的obj 文件放到该文件夹中
Step3. 修改mediatek/[source]/preloader/Makefile 文件,在该文件如下Code:
$(D_BIN)/$(PL_IMAGE_NAME).elf:
之前添加:
MYOBJS := $(D_ROOT)/myobj
Step4. 修改mediatek/[source]/preloader/Makefile 中$(D_BIN)/$(PL_IMAGE_NAME).elf
生成命令,将MYOBJS 加入:如下:
$(D_BIN)/$(PL_IMAGE_NAME).elf:
$(LD) --gc-sections -Bstatic -T$(MTK_PATH_PLATFORM)/link_descriptor.ld \
$(wildcard $(D_OBJ)/*) $(wildcard $(MYOBJS)/*) $(SECURITY_LIB) -Map
system.map -o $(D_BIN)/$(PL_IMAGE_NAME).elf
Step5. 如果添加的obj 文件在preloader 中有对应的Source code,还需要修改
Source code 对应的make File 文件,将该Source code 从make File 文件中删除,以
bmt.c 为例,需要修改medaitek/platform/$platform/preloader/src/drivers/makefile,
将bmt.c 从该文件的MOD_SRC 中删除
说明:preloader 的Source code 位于如下路径:
– mediatek/platform/$platform/preloader/
– mediatek/custom/$platform/preloader/
– mediatek/custom/common/preloader/
– mediatek/custom/$porject/preloader/
2. 如何在uboot 中预置obj 文件?
Branch: GB, GB2, ICS, ICS2
Case1. 该obj 文件是从第三方处获取,在codebase 原本不存在.c 文件,不需要编
译进某个lib 文件
Step1. 首先获取obj 文件
Step2. 在bootable/bootloader/uboot 目录下添加myobjs 文件夹,将Step1 中获取的
obj 文件放到该文件夹中
Step3. 修改bootable/bootloader/uboot/Makefile,在该文件如下Code:
GEN_UBOOT = \
之前添加:
MYCUSTOMOBJS := $(wildcard myobjs/*)
MEDIATEK CONFIDENTIAL
FOR zhanghui@ vanzotec.com USE ONLY
[email protected],time=2013-10-08 19:27:59,ip=180.166.121.198,doctitle=如何在preloader、uboot、lk、kernel中预置obj文件.docx,company=Vanzo_WCX
Step4. 修改bootable/bootloader/uboot/Makefile,将MYOBJSDIR 中的obj 文件添加
到u-boot 的生成命令中,如下:
GEN_UBOOT = \
UNDEF_SYM=`$(OBJDUMP) -x $(LIBBOARD) $(LIBS) | \
sed -n -e 's/.*$(SYM_PREFIX)__u_boot_cmd_.*/-u\1/p'|sort|uniq`;\
cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(MYCUSTOMOBJS)
$(__OBJS) \
Case2. 该obj 文件在Codebase 中存在对应的.c 文件,现在需要将.c 文件删除,替
换为obj 文件
Step1. 编译生成obj 文件,uboot 编译生成的obj 文件与其.c 文件位于同级目录下
Step2.在原先obj 文件目录下创建一个文件夹prebuilt,并将obj 文件放入其中,同
时将.c 文件删除
Step3. 修改包含该.c 文件的Makefile 文件(一般与.c 文件位于同级目录下),将该obj
文件的名称从OBJS 变量中删除,同时在该Makefile 中添加一个变量,MYOBJS,将
该obj 文件添加到MYOBJS 中,以
bootable/bootloader/uboot/drivers/video/cfb_console.c 为例,修改该目录下的
Makefile 文件,将cfb_console.o 从变量OBJS 中删除,同时添加一行:
MYOBJS := cfb_console.o
Step4. 继续修改Step3 中的Makefile,将MYOBJS 添加到生成LIB 的命令中,如下:
$(LIB): $(OBJS) $(SOBJS)
$(AR) $(ARFLAGS) $@ $(OBJS) $(MYOBJS) $(SOBJS)
Case3. 某些模块,Uboot 和kernel 共用同一份Source code,比如LCM,这种情况
需要做特殊处理,以LCM 为例,如下:
Step1. 首先编译出obj 文件,路径位于:mediatek/custom/out/$project/uboot/lcm,
同时将要替换的Source code 删除(mediate/custom/common/kernel/lcm)
Step2. 在mediatek/custom/$project/uboot 下面添加lcm 文件夹,同时将Step1 中获
取到的obj 文件添加到该文件夹下,同时将原目录下的obj 文件删除(这里获取的
obj 文件一定要是Uboot 目录下的,不要到kernel 目录下获取这些obj 文件)
Step3. 修改mediatek/custom/common/uboot/Makefile 文件,将要替换的obj 文件
名称从COBJS 删除:COBJS += $(patsubst %.c, %.o, $(wildcard lcm/*.c))
Step4. 继续修改Step3 中的Makefile,添加如下Code:MYOBJS := $(addprefix $(obj),
$(wildcard lcm/*.o)),同时将MYOBJS 添加到$(LIB)的编译命令中,如下:
$(LIB): $(OBJS) $(SOBJS)
$(AR) $(ARFLAGS) $@ $(OBJS) $(MYOBJS) $(SOBJS)
说明:Uboot 的Source Code 主要位于如下路径:
– bootable/bootloader/uboot/
– mediatek/platform/$platform/uboot/
MEDIATEK CONFIDENTIAL
FOR zhanghui@ vanzotec.com USE ONLY
[email protected],time=2013-10-08 19:27:59,ip=180.166.121.198,doctitle=如何在preloader、uboot、lk、kernel中预置obj文件.docx,company=Vanzo_WCX
– mediatek/custom/$platform/uboot/
– mediatek/custom/common/uboot/
– mediatek/custom/$porject/uboot/
3. 如何在kernel 中预置obj 文件?
Branch:GB, GB2, ICS
– 比如要将xxx.c 用xxx.o 替代编译
– 先正常编译出xxx.o
– 然后在xxx.c 所在目录下创建prebuilt 目录,将xxx.o 放入
• 注意prebuilt 目录的目录名不能修改,否则在clean 阶段会被清除
– 修改xxx.c 所在目录下的Makefile 文件,原本已经有obj-y := xxx.o,在其后
面添加xxx-y := prebuilt/xxx.o 即可
– mediatek/custom/[XXX]/kernel 目录下对应的Source Code 没有Makefile 文件,
自己在Source code 对应的同级目录下添加一个Makefile 即可
Branch:ICS2, JB, JB2
– 比如要将debug.c 用debug.o 替代编译
– 先正常编译出debug.o (针对kernel 和lk, uboot 共用Source Code 的情况,
如LCM,这里获取 到的obj 文件一定要是kernel/out 目录下的)
– 然后将debug.o 复制到原先debug.c 所在目录下,并重命名为
debug.o_shipped
– 原先debug.c 同级目录下的Makefile 不变,依然保持为
obj-y:=debug.o;mediatek/custom/[XXX]/kernel 目录下对应的Source Code 没有
Makefile 文件,自己在Source code 对应的同级目录下添加一个Makefile 即可
– 重新编译kernel 即可
说明:kernel 的Source code 主要位于如下路径:
– kernel/
– mediatek/platform/$platform/kernel/
– mediatek/[source]/kernel/
– mediatek/custom/$platform/kernel/
– mediatek/custom/common/kernel/
– mediatek/custom/$porject/kernel/
4. 如何在lk 中预置obj 文件
Branch:JB,JB2
Step1. 在bootable/bootloader/lk/makefile 中添加:MYOBJ :=
Step2. 获取obj 文件,Codebase 编译生成的obj 文件位于
bootable/bootloader/lk/build-$project/custom/$project/lk 目录下
Step3. 将获取的obj 文件放到与.c 文件相同目录下;同时可将.c 文件删除
MEDIATEK CONFIDENTIAL
FOR zhanghui@ vanzotec.com USE ONLY
[email protected],time=2013-10-08 19:27:59,ip=180.166.121.198,doctitle=如何在preloader、uboot、lk、kernel中预置obj文件.docx,company=Vanzo_WCX
Step4. 将相应的.c 文件从包含该.c 文件的rules.mk(一般与.c 文件位于同级目录)中删

Step5. 将Step3 中添加的.o 文件在rules.mk 中添加到MYOBJ,比如MYOBJ += test.o
Step6. 打开bootable/bootloader/lk/make/build.mk,将MYOBJ 添加到OUTELF 的生
成命令中,如下:
else
$(OUTELF): $(ALLOBJS) $(LINKER_SCRIPT)
@echo linking $@
$(NOECHO)$(LD) $(LDFLAGS) -T $(LINKER_SCRIPT) $(ALLOBJS)
$(MYOBJ) $(LIBGCC) -o $@ endif
Step7. 如果要替换的.c 文件是lk 与kernel 共用的,比如lcm 模块,那么Step2 需要
做一下修改:将获取的obj 文件放到mediatek/custom/$project/lk/lcm 中,同时要
确保这里获取的obj 文件是bootable/bootloader/lk/build-
$project/custom/$project/lk 目录下的,不要到kernel/out 目录下获取这些obj 文件
说明:lk 的Source Code 主要位于如下路径:
– mediatek/platform/$platform/lk/
– mediatek/custom/$platform/lk/
– mediatek/custom/common/lk/
– mediatek/custom/$porject/lk/
– bootable/bootloader/lk/
MEDIATEK CONFIDENTIAL

热点内容
树莓派如何搭建mqtt服务器 发布:2024-05-17 18:27:38 浏览:436
门口机sip服务器ip是什么 发布:2024-05-17 17:38:27 浏览:553
光遇安卓区是什么服 发布:2024-05-17 17:22:25 浏览:24
linux驱动开发教程 发布:2024-05-17 17:19:52 浏览:501
抖音中秋节视频脚本 发布:2024-05-17 17:19:51 浏览:194
快递柜为什么用安卓系统 发布:2024-05-17 17:17:18 浏览:907
电脑配置光纤接口怎么标注 发布:2024-05-17 17:06:56 浏览:977
如何用方向键控制安卓机 发布:2024-05-17 16:38:11 浏览:199
雨田系统源码 发布:2024-05-17 16:28:06 浏览:587
新手直播脚本 发布:2024-05-17 16:27:25 浏览:848