|
From: | Kevin Wells |
Subject: | RE: [Ltib] simple PWM driver for LPC3250 |
Date: | Fri, 10 Sep 2010 20:39:53 +0200 |
Hi Henry, The LPC32XX_CLKPWR_PWM_CLK_CTRL macro is already assigned a
virtual address via the io_p2v function. The CLKPWR registers are somewhat unique in the BSP code, as
they are used everywhere. You can use the io_p2v function to get a mapped virtual address
for a physical register address, but the right way is to ioremap the
register region. All the 32xx drivers do this. See the ./arch/arm/mach-lpc32xx/include/mach/platform.h file for
the macro definitions. The default kernel mapped regions can be located in
./arch/arm/mach-lpc32xx/common.c. thanks, Kevin Subject: Re: [Ltib] simple
PWM driver for LPC3250 Dear Giri, Thank you for replying. After fix the access method by ioremap(). The PWM works
normally. Here is my question: Why the LPC32XX_CLKPWR_PWM_CLK_CTRL doesn't need to
process by ioremap()? Is it statically map by kernel? Where can I find the relate
code in kernel source? Thank you very much. Henry 2010/9/9 Bangaragiri G <address@hidden> Hi, The LPC32XX_PWM1_BASE &
LPC32XX_PWM2_BASE addresses are
physical addresses, not kernel virtual addresses. Can you please ioremp these addresses in your
driver & try again? Regards, Giri ----------------------------------------------------------------- Bangaragiri G E-mail: address@hidden From:
ltib-bounces+bangaragiri.g=nxp.com@nongnu.org [mailto:ltib-bounces+bangaragiri.g=nxp.com@nongnu.org] On Behalf Of Li Yuan-Lung Dear
NXP guys, I
am trying to implement the simple PWM driver for LPC3250 under linux kernel
2.6.34. Now
I am stuck at the register writing. It's seems the Simple-PWM 1 and 2 were not
functional. Using
raw_readl and raw_writel to the LPC32XX_CLKPWR_PWM_CLK_CTRL register
is work, but which causes segmentation fault to the LPC32XX_PWM1_BASE and LPC32XX_PWM2_BASE. Please
kindly reply to me with some suggestion, thank you. Here
is my partial code in driver module: //HW init first tmp = __raw_readl(LPC32XX_CLKPWR_PWM_CLK_CTRL); printk(KERN_ERR PWM_DRVNAME ": PWM clk reg value
0x%x\n", tmp); tmp = LPC32XX_CLKPWR_PWMCLK_PWM2_DIV(1) |
LPC32XX_CLKPWR_PWMCLK_PWM2SEL_PCLK | LPC32XX_CLKPWR_PWMCLK_PWM2CLK_EN |\ LPC32XX_CLKPWR_PWMCLK_PWM1_DIV(1)
| LPC32XX_CLKPWR_PWMCLK_PWM1SEL_PCLK | LPC32XX_CLKPWR_PWMCLK_PWM1CLK_EN; __raw_writel(tmp, LPC32XX_CLKPWR_PWM_CLK_CTRL);//Turn
On PWM1 and PWM2 tmp = __raw_readl(LPC32XX_CLKPWR_PWM_CLK_CTRL); printk(KERN_ERR PWM_DRVNAME ": PWM clk reg value
= 0x%x after write.\n", tmp); tmp = LPC32XX_PWM1_EN | LPC32XX_PWM1_DUTY(127) |
LPC32XX_PWM1_RELOADV(10);// 13M/10/256 = 5k __raw_writel(tmp, LPC32XX_PWM1_BASE); tmp = LPC32XX_PWM2_EN | LPC32XX_PWM2_DUTY(127) |
LPC32XX_PWM2_RELOADV(10); __raw_writel(tmp, LPC32XX_PWM2_BASE); tmp = __raw_readl(LPC32XX_PWM1_BASE); printk(KERN_ERR PWM_DRVNAME ": PWM1 reg value =
0x%x.\n", tmp); tmp = __raw_readl(LPC32XX_PWM2_BASE); printk(KERN_ERR PWM_DRVNAME ": PWM2 reg value =
0x%x.\n", tmp); The
result: # insmod pwm.ko pwmd: PWM clk reg value 0x0 pwmd: PWM clk reg value = 0x11f after write. Unable to handle kernel paging request at virtual
address 4005c000 pgd = c3d78000 [4005c000] *pgd=00000000 Internal error: Oops: 805 [#1] PREEMPT last sysfs file: Modules linked in: pwm(+) CPU: 0 Not tainted (2.6.34 #21) PC is at pwm_init+0x40/0xdc [pwm] LR is at schedule+0x2cc/0x34c pc : [<bf0002d8>] lr :
[<c028ace8>] psr: 60000013 sp : c3dcff20 ip : c3dcfe40 fp : c3dcff3c r10: 00000000 r9 : c3dce000 r8 : 00000000 r7 : bf000298 r6 : c0365c6c r5 : 4005c000
r4 : f4004000 r3 : 80000a7f r2 : 00000000 r1 : 00000000
r0 : bf0004e0 Flags: nZCv IRQs on FIQs on Mode
SVC_32 ISA ARM Segment user Control: 0005317f Table: 83d78000 DAC:
00000015 Process insmod (pid: 393, stack limit = 0xc3dce270) Stack: (0xc3dcff20 to 0xc3dd0000) ff20: 0000001d 0000001d 00000000 bf0005c4 c3dcff7c
c3dcff40 c00253a8 bf0002a8 ff40: 00011585 bf0005c4 00000000 001361b0 c0026068
00000000 c3dcff7c 00000000 ff60: bf0005c4 00000000 001361b0 c0026068 c3dcffa4
c3dcff80 c00717e8 c0025358 ff80: c00a4654 c00a3048 00000000 00000000 00000000
00000080 00000000 c3dcffa8 ffa0: c0025ec0 c0071730 00000000 00000000 001361b0
00011585 00135fd8 00000000 ffc0: 00000000 00000000 00000000 00000080 00135fc0
00000040 00135fa8 bea0de94 ffe0: bea0d740 bea0d730 000a7e10 000093c0 a0000010
001361b0 80421031 80421431 Backtrace: [<bf000298>] (pwm_init+0x0/0xdc [pwm]) from
[<c00253a8>] (do_one_initcall+0x60/0x1ac) r5:bf0005c4 r4:00000000 [<c0025348>] (do_one_initcall+0x0/0x1ac) from
[<c00717e8>] (sys_init_module+0xc8/0x1f8) r8:c0026068 r7:001361b0 r6:00000000 r5:bf0005c4
r4:00000000 [<c0071720>] (sys_init_module+0x0/0x1f8) from
[<c0025ec0>] (ret_fast_syscall+0x0/0x2c) r7:00000080 r6:00000000 r5:00000000 r4:00000000 Code: eb411323 e59f5080 e59f3080 e59f0080 (e5853000) ---[ end trace 2fda102ac79baf84 ]--- Segmentation fault
|
[Prev in Thread] | Current Thread | [Next in Thread] |