Skip to contentSkip to conversation

VR4131 - MQ1132 - UPD63335

DISCUSSION Suresh. R 6 participants 6 messages Jan 16, 2004 – Jan 18, 2004 MIPS

lore
Share & tools
lore

Suresh. R

author
#0 lore raw

Hi,
This might be a very basic question, but I am very new to this field.
So please help me.

I am writing a linux device driver for UPD63335 audio codec. Its controlled through the MQ1132 co-processor. The VR4131 is the processor. The memory of MQ1132 is mapped to the processor memory in Kseg1 (0xA000 0000 onwards) which the manual says is TLB Unmapped region. Now my question is is it necessary to map this region before using it in Linux. Actually I have WinCE code for my reference. In that code the programmer is mapping the region using Virtual Cpoy and Virtual Alloc. Is it necessary to do that or Can I directly address the memory locatoin.

Please help

Thanks in advance

Regards
Suresh

#1 lore raw
Quoted 8 lines · Suresh. R

I am writing a linux device driver for UPD63335 audio codec. Its controlled through the MQ1132 co-processor. The VR4131 is the processor. The memory of MQ1132 is mapped to the processor memory in Kseg1 (0xA000 0000 onwards) which the manual says is TLB Unmapped region. Now my question is is it necessary to map this region before using it in Linux. Actually I have WinCE code for my reference. In that code the programmer is mapping the region using Virtual Cpoy and Virtual Alloc. Is it necessary to do that or Can I directly address the memory locatoin.

#2 lore raw
In reply to Suresh. R

If I recall correctly, WinCE runs drivers and system services in User mode, so any memory-mapped I/O would need to be set-up explicitly in the virtual address space. As Geert has pointed out, so long as it's in that first 512MB, a Linux driver running in Kernel mode can access it directly via Kseg1 (or Kseg0, if you wanted to be able to cache the data).

----- Original Message -----
From: "Suresh. R" <[email protected]>
To: <[email protected]>
Sent: Friday, January 16, 2004 8:32
Subject: VR4131 - MQ1132 - UPD63335

Quoted 22 lines

Hi,
This might be a very basic question, but I am very new to this field.
So please help me.

I am writing a linux device driver for UPD63335 audio codec. Its controlled through the MQ1132 co-processor. The VR4131 is the processor. The memory of MQ1132 is mapped to the processor memory in Kseg1 (0xA000 0000 onwards) which the manual says is TLB Unmapped region. Now my question is is it necessary to map this region before using it in Linux. Actually I have WinCE code for my reference. In that code the programmer is mapping the region using Virtual Cpoy and Virtual Alloc. Is it necessary to do that or Can I directly address the memory locatoin.

Please help

Thanks in advance

Regards
Suresh

#3 lore raw
In reply to Suresh. R
Quoted 11 lines · Suresh. R

This might be a very basic question, but I am very new to this field.
So please help me.

I am writing a linux device driver for UPD63335 audio codec. Its controlled through the MQ1132 co-processor. The VR4131 is the processor. The memory of MQ1132 is mapped to the processor memory in Kseg1 (0xA000 0000 onwards) which the manual says is TLB Unmapped region. Now my question is is it necessary to map this region before using it in Linux. Actually I have WinCE code for my reference. In that code the programmer is mapping the region using Virtual Cpoy and Virtual Alloc. Is it necessary to do that or Can I directly address the memory locatoin.

Generally a driver under Linux maps a device in it's initialization routine with a bit of code like

#define FOO_BASE 0x12340000UL /* physical address */
#define FOO_SIZE 0x00001000UL

...

	struct foo_regs *base;

	base = ioremap(0x1234, FOO_SIZE);
	if (!base) {
		/* Failed, game over  */
		harakiri();
		...
	}

	/* Success, make it blink ... */
	foo->blinkenlight = 42;
...
	/* Done, unmap before exiting.
	unmap(base);

...

This removes all knowledge about how a particular architecture handles mappings from the driver and therefore is generally the prefered way in Linux.

Linux/MIPS optimize the case where an unmapped area can be used, so no runtime overhead at all.

Ralf

#4 lore raw

On Sat, 2004-01-17 13:20:22 +0100, Ralf Baechle <[email protected]> wrote in message <[email protected]>:

Quoted 1 line

#define FOO_BASE 0x12340000UL /* physical address */

                        ^^^^^^^^^^
Quoted 3 lines

#define FOO_SIZE 0x00001000UL

	base = ioremap(0x1234, FOO_SIZE);
                       ^^^^^^

Not FOO_BASE?

MfG, JBG

Signature · 4 lines
   Jan-Benedict Glaw       [email protected]    . +49-172-7608481
   "Eine Freie Meinung in  einem Freien Kopf    | Gegen Zensur | Gegen Krieg
    fuer einen Freien Staat voll Freier Bürger" | im Internet! |   im Irak!
   ret = do_actions((curr | FREE_SPEECH) & ~(NEW_COPYRIGHT_LAW | DRM | TCPA));
#5 lore raw
Quoted 10 lines · Jan-Benedict Glaw

On Sat, 2004-01-17 13:20:22 +0100, Ralf Baechle <[email protected]> wrote in message <[email protected]>:

Quoted 1 line

#define FOO_BASE 0x12340000UL /* physical address */

                        ^^^^^^^^^^
Quoted 3 lines

#define FOO_SIZE 0x00001000UL

	base = ioremap(0x1234, FOO_SIZE);
                       ^^^^^^

Not FOO_BASE?

And it's better to use writel/readl and friends on thingies returned by ioremap:

      struct foo_regs* foo = ioremap(FOO_BASE, FOO_SIZE);
      ...      
      writel(42, &foo->blinkenlight);

Dimitri

Signature · 4 lines
Dimitri Torfs       |  NSCE 
[email protected] |  The Corporate Village
tel: +32 2 7008541  |  Da Vincilaan 7 - D1 
fax: +32 2 7008622  |  B-1935 Zaventem - Belgium