TR: interfacing FPGA to AT91RM9200

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]


I have made a driver that communicates with an FPGA. The FPGA are connected
on the AT91RM9200 memory bus. 

This is some extract from this driver:


int init_module(void) 
{
	int devno;
	int i=0;
	int tmp[4];
	int tmp2 = 0;
	struct cdev *romeo_cdev;
	
	//Initialise the driver structure and communication with userspace
	printk("Romeo: Registering FPGA driver...\n");
	devno = MKDEV(ROMEO_MAJOR, ROMEO_MINOR);
	printk("       devno : %d\n", devno);
	romeo_cdev = cdev_alloc();
	romeo_cdev->ops = &romeo_fops;
	if(cdev_add(romeo_cdev, devno, 1) < 0)
	{
	    printk("Romeo: Erreur cdev_add\n");
	    return -1;
	}


      //Configure SMC (Static Memory Controller)   
      at91_sys_write(AT91_SMC_CSR(3), 
                   AT91_SMC_RWHOLD_(1) | AT91_SMC_RWSETUP_(1) | 
                   AT91_SMC_ACSS_STD | AT91_SMC_DBW_16 | AT91_SMC_BAT | 
                   AT91_SMC_TDF_(1) | AT91_SMC_WSEN | AT91_SMC_NWS_(4)); 

	
	//Request IO region for the Xilinx FPGA and remmap it
	if(request_mem_region(XC2_BASE, XC2_SIZE, 
                            " Xilinx FPGA") == NULL)
	{
		printk("Region already used (XC2)\n");
		return -1;
	}
	xc2_addr = ioremap(XC2_BASE, XC2_SIZE); 
	printk("Xilinx remapped at 0x%X\n",(int)xc2_addr);	
}




And now test code for reading the FPGA:


	iowrite32(0x12345678,xc2_addr+0);
	tmp[0] = ioread32(xc2_addr+0);
	iowrite32(0x23456789,xc2_addr+4);
	tmp[1] = ioread32(xc2_addr+4);
	iowrite32(0x3456789A,xc2_addr+8);
	tmp[2] = ioread32(xc2_addr+8);
	iowrite32(0x456789AB,xc2_addr+12);
	tmp[3] = ioread32(xc2_addr+12);
	
	printk("Value: %d (0x%X)\n", tmp[0], tmp[0]);
	printk("Value: %d (0x%X)\n", tmp[1], tmp[1]);
	printk("Value: %d (0x%X)\n", tmp[2], tmp[2]);
	printk("Value: %d (0x%X)\n", tmp[3], tmp[3]);

This is not optimized. This is only for testing purpose.

Don't forget to clean after use:

void cleanup_module(void) 
{
      iounmap(xc2_addr);
	release_mem_region(XC2_BASE, XC2_SIZE);
}

Patrick

-----Message d'origine-----
De : linux-arm-bounces@xxxxxxxxxxxxxxxxxxxxxx
[mailto:linux-arm-bounces@xxxxxxxxxxxxxxxxxxxxxx] De la part de Russell King
- ARM Linux
Envoyé : vendredi, 5. septembre 2008 14:57
À : Manila Goel
Cc : linux-arm@xxxxxxxxxxxxxxxxxxxxxx
Objet : Re: interfacing FPGA to AT91RM9200

On Wed, Sep 03, 2008 at 11:37:08AM +0530, Manila Goel wrote:
> As u hv suggested i hv configured EBI and SMC as under:
> 
> int __iomem *addPtr;        // probably should be volatile!
> #define BASE_ADDRESS 0x50000000
> AT91_SYS->EBI_CSA &= 0xffffffef;
> AT91_SYS->EBI_CFGR &= 0xfffffffe;
> 
>
AT91_SYS->EBI_SMC2_CSR[4]=(AT91C_SMC2_NWS&0x01)|AT91C_SMC2_WSEN|AT91C_SMC2_B
AT|AT91C_SMC2_DBW_16;
> addPtr=(int __iomem*)ioremap(BASE_ADDRESS,4);
> writew(data,addPtr);

Umm, no.  Firstly, casts for the hell of it are bad.  Really, they are.
Don't use casts lightly.  If you have to put a cast in, THINK very
carefully.

Secondly, you're not checking the return value of ioremap.  Typical
embedded programmers. 8)

	void __iomem *ptr = ioremap(BASE_ADDRESS, 4);
	if (ptr)
		writew(data, ptr);

is all that you need.

(as for your problem, I can't help you with that.)

-------------------------------------------------------------------
List admin: http://lists.arm.linux.org.uk/mailman/listinfo/linux-arm
FAQ:        http://www.arm.linux.org.uk/mailinglists/faq.php
Etiquette:  http://www.arm.linux.org.uk/mailinglists/etiquette.php


-------------------------------------------------------------------
List admin: http://lists.arm.linux.org.uk/mailman/listinfo/linux-arm
FAQ:        http://www.arm.linux.org.uk/mailinglists/faq.php
Etiquette:  http://www.arm.linux.org.uk/mailinglists/etiquette.php


[Linux ARM]     [Linux ARM MSM]     [Linux ARM Kernel]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

Add to Google Follow linuxarm on Twitter