Restarting tasks ... done.
suspend: exit suspend, ret = 0 (1970-01-01 00:01:54.572740128 UTC)
soc-audio soc-audio.2: resume work completed
PM: Syncing filesystems ... done.
Freezing user space processes ... (elapsed 0.00 seconds) done.
Freezing remaining freezable tasks ... (elapsed 0.00 seconds) done.
:legacy_bus_drivername---:mmcblk
legacy_bus_name:mmc
suspend---platform_driver->name=soc-audio
:pm_bus_drivername---:soc-audio
pm_bus_name:platform
legacy_class_name:rfkill
suspend---platform_driver->name=alarm
:pm_bus_drivername---:alarm
pm_bus_name:platform
legacy_class_name:rtc
:pm_bus_drivername---:MXC Video Output
pm_bus_name:platform
suspend---platform_driver->name=mxc_v4l2
:pm_bus_drivername---:mxc_v4l2
pm_bus_name:platform
suspend---platform_driver->name=fsl-usb2-udc
USB Gadget suspended
:pm_bus_drivername---:fsl-usb2-udc
pm_bus_name:platform
suspend---platform_driver->name=lcd-backlight
:pm_bus_drivername---:lcd-backlight
pm_bus_name:platform
suspend---platform_driver->name=pmic_leds
:pm_bus_drivername---:pmic_leds
pm_bus_name:platform
suspend---platform_driver->name=pmic_leds
:pm_bus_drivername---:pmic_leds
pm_bus_name:platform
suspend---platform_driver->name=pmic_leds
:pm_bus_drivername---:pmic_leds
pm_bus_name:platform
suspend---platform_driver->name=pmic_light
:pm_bus_drivername---:pmic_light
pm_bus_name:platform
pm_bus_name:platform
:pm_bus_drivername---:pmic_rtc
pm_bus_name:platform
suspend---platform_driver->name=pmic_battery
:pm_bus_drivername---:pmic_battery
pm_bus_name:platform
suspend---platform_driver->name=pmic_adc
:pm_bus_drivername---:pmic_adc
pm_bus_name:platform
:pm_bus_drivername---:mc13892-regulatr
pm_bus_name:platform
:pm_bus_drivername---:mc13892-regulatr
pm_bus_name:platform
:pm_bus_drivername---:mc13892-regulatr
pm_bus_name:platform
:pm_bus_drivername---:mc13892-regulatr
pm_bus_name:platform
:pm_bus_drivername---:mc13892-regulatr
pm_bus_name:platform
:pm_bus_drivername---:mc13892-regulatr
pm_bus_name:platform
:pm_bus_drivername---:mc13892-regulatr
pm_bus_name:platform
:pm_bus_drivername---:mc13892-regulatr
pm_bus_name:platform
:pm_bus_drivername---:mc13892-regulatr
pm_bus_name:platform
:pm_bus_drivername---:mc13892-regulatr
pm_bus_name:platform
:pm_bus_drivername---:mc13892-regulatr
pm_bus_name:platform
:pm_bus_drivername---:mc13892-regulatr
pm_bus_name:platform
:pm_bus_drivername---:mc13892-regulatr
pm_bus_name:platform
:pm_bus_drivername---:mc13892-regulatr
pm_bus_name:platform
:pm_bus_drivername---:mc13892-regulatr
pm_bus_name:platform
:pm_bus_drivername---:mc13892-regulatr
pm_bus_name:platform
:pm_bus_drivername---:mc13892-regulatr
pm_bus_name:platform
:pm_bus_drivername---:mc13892-regulatr
pm_bus_name:platform
:pm_bus_drivername---:mc13892-regulatr
pm_bus_name:platform
:pm_bus_drivername---:mc13892-regulatr
pm_bus_name:platform
:pm_bus_drivername---:mc13892-regulatr
pm_bus_name:platform
pm_bus_name:platform
legacy_bus_name:i2c
legacy_bus_name:i2c
:legacy_bus_drivername---:sgtl5000-i2c
legacy_bus_name:i2c
legacy_bus_name:i2c
:legacy_bus_drivername---:mc13892
legacy_bus_name:i2c
:legacy_bus_drivername---:isa1200
legacy_bus_name:i2c
:legacy_bus_drivername---:tps60250
legacy_bus_name:i2c
i2c-adapter i2c-0: ACK not received
AKI2C_TxData: transfer error
:legacy_bus_drivername---:akm8973
legacy_bus_name:i2c
:legacy_bus_drivername---:mma7456
legacy_bus_name:i2c
:legacy_bus_drivername---:ov3640
legacy_bus_name:i2c
:legacy_bus_drivername---:si4702
legacy_bus_name:i2c
suspend---platform_driver->name=mxcintuart
:pm_bus_drivername---:mxcintuart
pm_bus_name:platform
suspend---platform_driver->name=mxcintuart
:pm_bus_drivername---:mxcintuart
pm_bus_name:platform
suspend---platform_driver->name=mxcintuart
:pm_bus_drivername---:mxcintuart
pm_bus_name:platform
:pm_bus_drivername---:android_usb
pm_bus_name:platform
:pm_bus_drivername---:android_pmem
pm_bus_name:platform
:pm_bus_drivername---:android_pmem
pm_bus_name:platform
suspend---platform_driver->name=gps_ioctrl
:pm_bus_drivername---:gps_ioctrl
pm_bus_name:platform
:pm_bus_drivername---:mxc_bt
pm_bus_name:platform
:pm_bus_drivername---:imx-3stack-sgtl5000
pm_bus_name:platform
pm_bus_name:platform
suspend---platform_driver->name=mxsdhci
:pm_bus_drivername---:mxsdhci
pm_bus_name:platform
suspend---platform_driver->name=mxsdhci
:pm_bus_drivername---:mxsdhci
pm_bus_name:platform
suspend---platform_driver->name=mxc_nandv2_flash
:pm_bus_drivername---:mxc_nandv2_flash
pm_bus_name:platform
suspend---platform_driver->name=gpio-trackball
:pm_bus_drivername---:gpio-trackball
pm_bus_name:platform
suspend---platform_driver->name=gpio-keys
:pm_bus_drivername---:gpio-keys
pm_bus_name:platform
:pm_bus_drivername---:timed-i2c
pm_bus_name:platform
suspend---platform_driver->name=mxc_mc13892_bl
:pm_bus_drivername---:mxc_mc13892_bl
pm_bus_name:platform
suspend---platform_driver->name=mxc_sdc_fb
:pm_bus_drivername---:mxc_sdc_fb
pm_bus_name:platform
suspend---platform_driver->name=mxc_sdc_fb
:pm_bus_drivername---:mxc_sdc_fb
pm_bus_name:platform
suspend---platform_driver->name=mxc_sdc_fb
:pm_bus_drivername---:mxc_sdc_fb
pm_bus_name:platform
pm_bus_name:platform
:pm_bus_drivername---:lcd_spi
pm_bus_name:platform
suspend---platform_driver->name=pwm-backlight
:pm_bus_drivername---:pwm-backlight
pm_bus_name:platform
:pm_bus_drivername---:mxc_pwm
pm_bus_name:platform
pm_bus_name:platform
:pm_bus_drivername---:mxc_iim
pm_bus_name:platform
suspend---platform_driver->name=mxc_dvfs_core
:pm_bus_drivername---:mxc_dvfs_core
pm_bus_name:platform
:pm_bus_drivername---:sdram_autogating
pm_bus_name:platform
suspend---platform_driver->name=busfreq
:pm_bus_drivername---:busfreq
pm_bus_name:platform
:pm_bus_drivername---:mx51_lpmode
pm_bus_name:platform
suspend---platform_driver->name=tve
:pm_bus_drivername---:tve
pm_bus_name:platform
pm_bus_name:platform
suspend---platform_driver->name=mxc_vpu
:pm_bus_drivername---:mxc_vpu
pm_bus_name:platform
:pm_bus_drivername---:mxc_ipu
pm_bus_name:platform
pm_bus_name:platform
pm_bus_name:platform
suspend---platform_driver->name=mxc_i2c_hs
:pm_bus_drivername---:mxc_i2c_hs
pm_bus_name:platform
:pm_bus_drivername---:mxc_i2c
pm_bus_name:platform
:pm_bus_drivername---:mxc_i2c
pm_bus_name:platform
:pm_bus_drivername---:mxc_spi
pm_bus_name:platform
suspend---platform_driver->name=mxc_wdt
:pm_bus_drivername---:mxc_wdt
pm_bus_name:platform
:pm_bus_drivername---:power
pm_bus_name:platform
wakeup wake lock: evdev
resume---platform_driver->name=mxc_wdt
resume---platform_driver->name=mxc_i2c_hs
resume---platform_driver->name=mxc_vpu
resume---platform_driver->name=tve
resume---platform_driver->name=busfreq
resume---platform_driver->name=mxc_dvfs_core
resume---platform_driver->name=pwm-backlight
resume---platform_driver->name=mxc_sdc_fb
mxc_ipu mxc_ipu: Channel already disabled 9
mxc_ipu mxc_ipu: Channel already uninitialized 9
resume---platform_driver->name=mxc_sdc_fb
resume---platform_driver->name=mxc_sdc_fb
resume---platform_driver->name=mxc_mc13892_bl
resume---platform_driver->name=gpio-keys
resume---platform_driver->name=gpio-trackball
resume---platform_driver->name=mxc_nandv2_flash
resume---platform_driver->name=mxsdhci
resume---platform_driver->name=mxsdhci
resume---platform_driver->name=gps_ioctrl
resume---platform_driver->name=mxcintuart
resume---platform_driver->name=mxcintuart
resume---platform_driver->name=mxcintuart
i2c-adapter i2c-0: ACK not received
AKI2C_TxData: transfer error
resume---platform_driver->name=pmic_adc
resume---platform_driver->name=pmic_battery
resume---platform_driver->name=pmic_light
resume---platform_driver->name=pmic_leds
resume---platform_driver->name=pmic_leds
resume---platform_driver->name=pmic_leds
resume---platform_driver->name=lcd-backlight
resume---platform_driver->name=fsl-usb2-udc
udc run
USB Gadget resumed
resume---platform_driver->name=mxc_v4l2
resume---platform_driver->name=alarm
Changed RF State to 0
resume---platform_driver->name=soc-audio
2010年1月5日 星期二
machine ID mismatch
1
_arch_info has machine ID embedded
2
arch/arm/include/asm/mach/arch.h
.arch.info.init
{
.nr = MACH_TYPE_##_type;
}
3
bootloader provide this tag
for uboot include/asm/mach-types.h
_arch_info has machine ID embedded
2
arch/arm/include/asm/mach/arch.h
.arch.info.init
{
.nr = MACH_TYPE_##_type;
}
3
bootloader provide this tag
for uboot include/asm/mach-types.h
2009年12月28日 星期一
kernel debug Low level
CONFIG_DEBUG_LL
CONFIG_DEBUG_KERNEL
arch/arm/plat-mxc/include/mach/debug-macro.S
add definition:
#define MXC_LL_UART_PADDR UART1_BASE_ADDR
#define MXC_LL_UART_VADDR AIPS1_IO_ADDRESS(UART1_BASE_ADDR)
CONFIG_DEBUG_KERNEL
arch/arm/plat-mxc/include/mach/debug-macro.S
add definition:
#define MXC_LL_UART_PADDR UART1_BASE_ADDR
#define MXC_LL_UART_VADDR AIPS1_IO_ADDRESS(UART1_BASE_ADDR)
2009年12月24日 星期四
嵌入式Linux内核时钟初始化问题
c
嵌入式Linux内核时钟初始化问题
内核版本:Linux 2.6.18
平台: FOR ARM
首先搞清楚RTC在kernel内的作用:
linux系统有两个时钟:一个是由主板电池驱动的“Real Time Clock”也叫做RTC或者叫CMOS时钟,
硬件时钟。当操作系统关机的时候,用这个来记录时间,但是对于运行的系统是不用这个时间的。
另一个时间是 “System clock”也叫内核时钟或者软件时钟,是由软件根据时间中断来进行计数的,
内核时钟在系统关机的情况下是不存在的,所以,当操作系统启动的时候,内核时钟是要读取RTC时间
来进行时间同步。并且在系统关机的时候将系统时间写回RTC中进行同步。
如前所述,Linux内核与RTC进行互操作的时机只有两个:
1) 内核在启动时从RTC中读取启动时的时间与日期;
2) 内核在需要时将时间与日期回写到RTC中。
系统启动时,内核通过读取RTC来初始化内核时钟,又叫墙上时间,该时间放在xtime变量中。
The current time of day (the wall time) is defined in kernel/timer.c:
struct timespec xtime;
The timespec data structure is defined in as:
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
问题1:系统启动时在哪读取RTC的值并设置内核时钟进行时间同步的呢?
最有可能读取RTC设置内核时钟的位置应该在arch/arm/kernel/time.c里的time_init函数内.
time.c为系统的时钟驱动部分.time_init函数会在系统初始化时,由init/main.c里的start_kernel函数内调用.X86架构就是在这里读RTC值并初始化系统时钟xtime的.
ARM架构的time_init代码如下:
/* arch/arm/kernel/time.c */
void __init time_init(void)
{
if (system_timer->offset == NULL)
system_timer->offset = dummy_gettimeoffset;
system_timer->init();
#ifdef CONFIG_NO_IDLE_HZ
if (system_timer->dyn_tick)
system_timer->dyn_tick->lock = SPIN_LOCK_UNLOCKED;
#endif
}
上面system_timer->init()实际执行的是时钟驱动体系架构相关(具体平台)部分定义的init函数,若是 s3c2410平台,则执行的为arch/arm/mach-s3c2410/time.c里定义的s3c2410_timer_init函数.不过 s3c2410_timer_init()也没有读RTC的代码.整个时钟驱动初始化的过程大致就执行这些代码.
既然在系统时钟驱动初始化的过程中没有读RTC值并设置内核时钟,那会在哪设置呢?
我搜了一下,发现内核好象只有在arch/cris/kernel/time.c里有RTC相关代码,如下:
/* arch/cris/kernel/time.c */
/* grab the time from the RTC chip */
//读RTC的函数
unsigned long get_cmos_time(void)
{
unsigned int year, mon, day, hour, min, sec;
sec = CMOS_READ(RTC_SECONDS);
min = CMOS_READ(RTC_MINUTES);
hour = CMOS_READ(RTC_HOURS);
day = CMOS_READ(RTC_DAY_OF_MONTH);
mon = CMOS_READ(RTC_MONTH);
…………
return mktime(year, mon, day, hour, min, sec);
}
这个函数会在update_xtime_from_cmos内被调用:
void update_xtime_from_cmos(void)
{
if(have_rtc) {
xtime.tv_sec = get_cmos_time();
xtime.tv_nsec = 0;
}
}
另外还有设置rtc的函数
int set_rtc_mmss(unsigned long nowtime); /* write time into RTC chip */
不过我加了printk测试了一下,好象arch/cris/kernel/time.c这个文件和这两个函数只是适用与X86?
ARM平台启动时并不走这边.因此执行不到这些函数。
那ARM平台启动时,系统是在哪读RTC的值并对内核时钟(WallTime)进行初始化的呢?
已解决:
嵌入式Linux内核(ARM)是在系统启动时执行/etc/init.d/hwclock.sh脚本,这个脚本会调用hwclock小程序读取RTC的值并设置系统时钟。
(换句话说,这要取决于你制作的文件系统里是否有这样的脚本)
/* /etc/init.d/hwclock.sh */
DAEMON1=/sbin/hwclock
start() {
local RET ERROR=
[ ! -f /etc/adjtime ] && echo "0.0 0 0.0" > /etc/adjtime
log_status_msg "Setting the System Clock using the Hardware Clock as reference..." -n
# Copies Hardware Clock time to System Clock using the correct
# timezone for hardware clocks in local time, and sets kernel
# timezone. DO NOT REMOVE.
[ "$HWCLOCKACCESS" != no ] && $DAEMON1 --hctosys $GMT $BADYEAR
#
# Now that /usr/share/zoneinfo should be available,
# announce the local time.
#
log_status_msg "System Clock set. Local time: `date`"
log_status_msg ""
return 0
}
hwclock最先读取的设备文件是 /dev/rtc ,busybox里面的hwclock是这样实现的:
static int xopen_rtc(int flags)
{
int rtc;
if (!rtcname) {
rtc = open("/dev/rtc", flags);
if (rtc >= 0)
return rtc;
rtc = open("/dev/rtc0", flags);
if (rtc >= 0)
return rtc;
rtcname = "/dev/misc/rtc";
}
return xopen(rtcname, flags);
}
2. 内核如何更新RTC时钟?
通过set_rtc函数指针指向的函数,set_rtc在arch/arm/kernel/time.c内
/* arch/arm/kernel/time.c */
/*
* hook for setting the RTC's idea of the current time.
*/
int (*set_rtc)(void);
但是set_rtc函数指针在哪初始化的呢?set_rtc应该是和RTC驱动相关的函数.
搜索kernel源码后发现,好象内核其他地方并没有对其初始化。待解决!
set_rtc在do_set_rtc内调用
static inline void do_set_rtc(void)
{
……
if (set_rtc())
/*
* rtc update failed. Try again in 60s
*/
next_rtc_update = xtime.tv_sec + 60;
else
next_rtc_update = xtime.tv_sec + 660; /* update every ~11 minutes by default*/
}
do_set_rtc在timer_tick里调用
/*
* Kernel system timer support.
*/
void timer_tick(struct pt_regs *regs)
{
profile_tick(CPU_PROFILING, regs);
do_leds();
do_set_rtc();
do_timer(1);
……
}
timer_tick为Kernel提供的体系架构无关的时钟中断处理函数,通常会在体系架构相关的时钟中断处理函数内调用它。如s3c2410是这样的:
在arch/arm/mach-s3c2410/time.c中
* IRQ handler for the timer
*/
static irqreturn_t
s3c2410_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
write_seqlock(&xtime_lock);
timer_tick(regs);
write_sequnlock(&xtime_lock);
return IRQ_HANDLED;
}
嵌入式Linux内核时钟初始化问题
内核版本:Linux 2.6.18
平台: FOR ARM
首先搞清楚RTC在kernel内的作用:
linux系统有两个时钟:一个是由主板电池驱动的“Real Time Clock”也叫做RTC或者叫CMOS时钟,
硬件时钟。当操作系统关机的时候,用这个来记录时间,但是对于运行的系统是不用这个时间的。
另一个时间是 “System clock”也叫内核时钟或者软件时钟,是由软件根据时间中断来进行计数的,
内核时钟在系统关机的情况下是不存在的,所以,当操作系统启动的时候,内核时钟是要读取RTC时间
来进行时间同步。并且在系统关机的时候将系统时间写回RTC中进行同步。
如前所述,Linux内核与RTC进行互操作的时机只有两个:
1) 内核在启动时从RTC中读取启动时的时间与日期;
2) 内核在需要时将时间与日期回写到RTC中。
系统启动时,内核通过读取RTC来初始化内核时钟,又叫墙上时间,该时间放在xtime变量中。
The current time of day (the wall time) is defined in kernel/timer.c:
struct timespec xtime;
The timespec data structure is defined in
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
问题1:系统启动时在哪读取RTC的值并设置内核时钟进行时间同步的呢?
最有可能读取RTC设置内核时钟的位置应该在arch/arm/kernel/time.c里的time_init函数内.
time.c为系统的时钟驱动部分.time_init函数会在系统初始化时,由init/main.c里的start_kernel函数内调用.X86架构就是在这里读RTC值并初始化系统时钟xtime的.
ARM架构的time_init代码如下:
/* arch/arm/kernel/time.c */
void __init time_init(void)
{
if (system_timer->offset == NULL)
system_timer->offset = dummy_gettimeoffset;
system_timer->init();
#ifdef CONFIG_NO_IDLE_HZ
if (system_timer->dyn_tick)
system_timer->dyn_tick->lock = SPIN_LOCK_UNLOCKED;
#endif
}
上面system_timer->init()实际执行的是时钟驱动体系架构相关(具体平台)部分定义的init函数,若是 s3c2410平台,则执行的为arch/arm/mach-s3c2410/time.c里定义的s3c2410_timer_init函数.不过 s3c2410_timer_init()也没有读RTC的代码.整个时钟驱动初始化的过程大致就执行这些代码.
既然在系统时钟驱动初始化的过程中没有读RTC值并设置内核时钟,那会在哪设置呢?
我搜了一下,发现内核好象只有在arch/cris/kernel/time.c里有RTC相关代码,如下:
/* arch/cris/kernel/time.c */
/* grab the time from the RTC chip */
//读RTC的函数
unsigned long get_cmos_time(void)
{
unsigned int year, mon, day, hour, min, sec;
sec = CMOS_READ(RTC_SECONDS);
min = CMOS_READ(RTC_MINUTES);
hour = CMOS_READ(RTC_HOURS);
day = CMOS_READ(RTC_DAY_OF_MONTH);
mon = CMOS_READ(RTC_MONTH);
…………
return mktime(year, mon, day, hour, min, sec);
}
这个函数会在update_xtime_from_cmos内被调用:
void update_xtime_from_cmos(void)
{
if(have_rtc) {
xtime.tv_sec = get_cmos_time();
xtime.tv_nsec = 0;
}
}
另外还有设置rtc的函数
int set_rtc_mmss(unsigned long nowtime); /* write time into RTC chip */
不过我加了printk测试了一下,好象arch/cris/kernel/time.c这个文件和这两个函数只是适用与X86?
ARM平台启动时并不走这边.因此执行不到这些函数。
那ARM平台启动时,系统是在哪读RTC的值并对内核时钟(WallTime)进行初始化的呢?
已解决:
嵌入式Linux内核(ARM)是在系统启动时执行/etc/init.d/hwclock.sh脚本,这个脚本会调用hwclock小程序读取RTC的值并设置系统时钟。
(换句话说,这要取决于你制作的文件系统里是否有这样的脚本)
/* /etc/init.d/hwclock.sh */
DAEMON1=/sbin/hwclock
start() {
local RET ERROR=
[ ! -f /etc/adjtime ] && echo "0.0 0 0.0" > /etc/adjtime
log_status_msg "Setting the System Clock using the Hardware Clock as reference..." -n
# Copies Hardware Clock time to System Clock using the correct
# timezone for hardware clocks in local time, and sets kernel
# timezone. DO NOT REMOVE.
[ "$HWCLOCKACCESS" != no ] && $DAEMON1 --hctosys $GMT $BADYEAR
#
# Now that /usr/share/zoneinfo should be available,
# announce the local time.
#
log_status_msg "System Clock set. Local time: `date`"
log_status_msg ""
return 0
}
hwclock最先读取的设备文件是 /dev/rtc ,busybox里面的hwclock是这样实现的:
static int xopen_rtc(int flags)
{
int rtc;
if (!rtcname) {
rtc = open("/dev/rtc", flags);
if (rtc >= 0)
return rtc;
rtc = open("/dev/rtc0", flags);
if (rtc >= 0)
return rtc;
rtcname = "/dev/misc/rtc";
}
return xopen(rtcname, flags);
}
2. 内核如何更新RTC时钟?
通过set_rtc函数指针指向的函数,set_rtc在arch/arm/kernel/time.c内
/* arch/arm/kernel/time.c */
/*
* hook for setting the RTC's idea of the current time.
*/
int (*set_rtc)(void);
但是set_rtc函数指针在哪初始化的呢?set_rtc应该是和RTC驱动相关的函数.
搜索kernel源码后发现,好象内核其他地方并没有对其初始化。待解决!
set_rtc在do_set_rtc内调用
static inline void do_set_rtc(void)
{
……
if (set_rtc())
/*
* rtc update failed. Try again in 60s
*/
next_rtc_update = xtime.tv_sec + 60;
else
next_rtc_update = xtime.tv_sec + 660; /* update every ~11 minutes by default*/
}
do_set_rtc在timer_tick里调用
/*
* Kernel system timer support.
*/
void timer_tick(struct pt_regs *regs)
{
profile_tick(CPU_PROFILING, regs);
do_leds();
do_set_rtc();
do_timer(1);
……
}
timer_tick为Kernel提供的体系架构无关的时钟中断处理函数,通常会在体系架构相关的时钟中断处理函数内调用它。如s3c2410是这样的:
在arch/arm/mach-s3c2410/time.c中
* IRQ handler for the timer
*/
static irqreturn_t
s3c2410_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
write_seqlock(&xtime_lock);
timer_tick(regs);
write_sequnlock(&xtime_lock);
return IRQ_HANDLED;
}
2009年12月18日 星期五
trace clock source of RTC
1. gettimeofday();
2. system_call sys_gettimeofday
3 kernel level: do_gettimeofday
4 kernel /time /jiffies.c jiffies
5 kernel/time/clocksource.c clocksource0
2. system_call sys_gettimeofday
3 kernel level: do_gettimeofday
4 kernel /time /jiffies.c jiffies
5 kernel/time/clocksource.c clocksource0
2009年11月26日 星期四
2009年6月17日 星期三
kernel memory detect
arm linux中一般在cmdline或传递tag参数中设置, 个别板子在machine_desc.fixup函数中设置. 按顺序分别说明:
1, 出现顺序(内核版本2.6.25.20,下同)
start_kernel()
->setup_arch()
->mdesc->fixup()
->parse_tags()
->parse_tag_mem32()
->parse_cmdline()
->early_mem()
2, fixup()函数
这个函数arm平台用的很少. 我只找到eseries.c, mach-smdk2413.c, mach-vstms.c这几个arm板子有, smdk2413_fixup()是在bootloader传递tag地址与machine_desc预设tag地址(mem_PA+0x100)不同时设置memory的start和size. 如果fixup起作用, 会从tag中把mem tag改为ATAG_NONE, 后面的"parse_tag_mem32"就没用了.
3, parse_tag_mem32()
该函数定义在"arch\arm\kernel\setup.c". 把bootloader传入的mem tag(ATAG_MEM)的start和size参数通过"arm_add_memory()"加入到meminfo的最后一个bank中. start是memory物理起始地址.
4, early_mem()
该函数定义在"arch\arm\kernel\setup.c". 处理cmdline中的"mem=size@start".
如果没有定义mem起始地址, 使用PHYS_OFFSET(arm中应由arm开发板设置)作为start. early_mem()会覆盖前面设置的meminfo.
呵呵, 你为什么会想到找这个? 我当初是板级移植u-boot到s3c2410时分析的代码, 当时还不知道sourceinsight, 用grep查找的:(
"arch\arm\mm\init.c"文件和这个好像没关系, 里面的"bootmem_init()"会根据这里设置的meminfo计算出high_memory. 系统物理memory会1:1映射到"PAGE_OFFSET---high_memory-1".
1, 出现顺序(内核版本2.6.25.20,下同)
start_kernel()
->setup_arch()
->mdesc->fixup()
->parse_tags()
->parse_tag_mem32()
->parse_cmdline()
->early_mem()
2, fixup()函数
这个函数arm平台用的很少. 我只找到eseries.c, mach-smdk2413.c, mach-vstms.c这几个arm板子有, smdk2413_fixup()是在bootloader传递tag地址与machine_desc预设tag地址(mem_PA+0x100)不同时设置memory的start和size. 如果fixup起作用, 会从tag中把mem tag改为ATAG_NONE, 后面的"parse_tag_mem32"就没用了.
3, parse_tag_mem32()
该函数定义在"arch\arm\kernel\setup.c". 把bootloader传入的mem tag(ATAG_MEM)的start和size参数通过"arm_add_memory()"加入到meminfo的最后一个bank中. start是memory物理起始地址.
4, early_mem()
该函数定义在"arch\arm\kernel\setup.c". 处理cmdline中的"mem=size@start".
如果没有定义mem起始地址, 使用PHYS_OFFSET(arm中应由arm开发板设置)作为start. early_mem()会覆盖前面设置的meminfo.
呵呵, 你为什么会想到找这个? 我当初是板级移植u-boot到s3c2410时分析的代码, 当时还不知道sourceinsight, 用grep查找的:(
"arch\arm\mm\init.c"文件和这个好像没关系, 里面的"bootmem_init()"会根据这里设置的meminfo计算出high_memory. 系统物理memory会1:1映射到"PAGE_OFFSET---high_memory-1".
訂閱:
文章 (Atom)