|
From: | Bangaragiri G |
Subject: | RE: [Ltib] simple PWM driver for LPC3250 |
Date: | Thu, 9 Sep 2010 11:54:15 +0200 |
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:
address@hidden
[mailto:address@hidden 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] |