Atmel website | ARM Community | AVR freaks | Technical Support
Banner
 FAQ •  Search •  Register •  Login 

All times are UTC + 1 hour [ DST ]




Post new topic Reply to topic  [ 8 posts ] 
Author Message
 Post subject: JFFS2 on AT45DB642x
PostPosted: Fri Feb 08, 2008 4:18 pm 
Offline

Joined: Sat Jun 30, 2007 1:18 am
Posts: 20
Location: Belgrade
Hi all!

I have At91SAM9260 EK board, with AT45DB642x dataflash. As far as I understand, erase block size is 1056 (0x420). I've partitioned dataflash (in area after 0x38000) using kernel cmdline mtdparts command and I can see all partitions during boot time or in /proc/mtd. mtd_debug command also gives appropriate results.

I've created jffs2 image by:
mkfs.jffs2 -p -e 1056 -x zlib -x rtime -x lzo -x lzari -l > /jffs2.img

(I dont need compression)

Copied image by dd to the right /dev/mtdX device
dd if=/jffs2.img of=/dev/mtdX

But, when I mount correct /dev/mtdblockX (mount /dev/mtdblockX /mnt -t jffs2) i get tons of error messages:
Code:
[..]
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x001ad00: 0x0004 instead
[..]
Perhaps the file system was created with the wrong erase size?
[..]


I'm pretty sure that 1056 bytes is the right erase block size for the specified dataflash. I need help! :)

Kernel is 2.6.20.15, mkfs.jffs2 version 1.43.

Beside this question, does anyone have a suggestion for the read only file system? I plan to have root RO, and one writtable file system for configurations & co.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Feb 08, 2008 4:39 pm 
Offline

Joined: Mon Dec 10, 2007 5:26 pm
Posts: 30
Hi,

you have to define page and erase size.
I used these for creating jffs2 on at45
-s 0x420 -e 0x2100

grtzzzz


Top
 Profile  
 
 Post subject:
PostPosted: Fri Feb 08, 2008 4:47 pm 
Offline

Joined: Sat Jun 30, 2007 1:18 am
Posts: 20
Location: Belgrade
swinnenb wrote:
you have to define page and erase size.
I used these for creating jffs2 on at45
-s 0x420 -e 0x2100


I've defined the erase size, but in decimal. Why you specify erase size to 0x2100 when it's (by specification from Atmel) 0x420?

Anyway, i tried your settings right now, with the same (bad) results. (actually i've found that buildroot is using the same values for at91sam9260dfc)


Top
 Profile  
 
 Post subject:
PostPosted: Fri Feb 08, 2008 5:49 pm 
Offline

Joined: Sat Jun 30, 2007 1:18 am
Posts: 20
Location: Belgrade
swinnenb wrote:
I used these for creating jffs2 on at45
-s 0x420 -e 0x2100


Actually, this is the solution for the problem. Thanks!

But, I'm a little bit confused why erase block size should be specified to 0x2100 (8448bytes), when erase block size for AT45 dataflash is 1056 bytes (according to datasheet from Atmel, even cat /proc/mtd says that e.b. size). Maybe some bug in mkfs.jffs2?

I created jffs2 image file with:
mkfs.jffs2 -p -s 0x420 -e 0x2100 -x zlib -x rtime -n -l -o image.jffs2


Top
 Profile  
 
 Post subject:
PostPosted: Wed Feb 13, 2008 3:05 pm 
Offline

Joined: Mon Dec 10, 2007 5:26 pm
Posts: 30
Hi,

-e stands for erase BLOCK size

check atmel spec for block size it tells you it is 8K bytes -> 8*1056

That is why I use 0x2100

Grtzzzz


Top
 Profile  
 
 Post subject:
PostPosted: Wed Mar 26, 2008 2:48 pm 
Offline

Joined: Tue Jun 26, 2007 6:27 pm
Posts: 81
Hello,

could anybody explain me how to make static Partitions on the AT45DB642x dataflash using the AT91SAM9260EK ?

One choice is to use mtdparts in the kernel command line...

Is there a possibility to make static partitions for that SPI dataflash and which files have to be adapted ?

Thank you


Top
 Profile  
 
 Post subject:
PostPosted: Wed Mar 26, 2008 3:05 pm 
Offline

Joined: Mon Dec 10, 2007 5:26 pm
Posts: 30
here is the code I use

just take the bits you need, I commented some parts to optimize my own board.

check for this: my_flash1_partitions[]

grtzzzzzz

Code:
/*
* linux/arch/arm/mach-at91/board-sam9260ek.c
*
*  Copyright (C) 2005 SAN People
*  Copyright (C) 2006 Atmel
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

#include <linux/types.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/spi/spi.h>
#include <linux/spi/flash.h>
#include <linux/mtd/mtd.h>

#include <asm/hardware.h>
#include <asm/setup.h>
#include <asm/mach-types.h>
#include <asm/irq.h>

#include <asm/mach/arch.h>
#include <asm/mach/map.h>
#include <asm/mach/irq.h>

#include <asm/arch/board.h>
#include <asm/arch/gpio.h>
#include <asm/arch/at91sam926x_mc.h>

#include "generic.h"


/*
* Serial port configuration.
*    0 .. 5 = USART0 .. USART5
*    6      = DBGU
*/
static struct at91_uart_config __initdata ek_uart_config = {
   .console_tty   = 0,            /* ttyS0 */
   .nr_tty      = 5,
   .tty_map   = { 6, 0, 1, 2, 3, -1, -1 }   /* ttyS0, ..., ttyS6 */
};

static void __init ek_map_io(void)
{
   /* Initialize processor: 18.432 MHz crystal */
   at91sam9260_initialize(18432000);

   /* Setup the serial ports and console */
   at91_init_serial(&ek_uart_config);
}

static void __init ek_init_irq(void)
{
   at91sam9260_init_interrupts(NULL);
}


/*
* USB Host port
*/
static struct at91_usbh_data __initdata ek_usbh_data = {
   .ports      = 2,
};

/*
* USB Device port
*/
static struct at91_udc_data __initdata ek_udc_data = {
   .vbus_pin   = AT91_PIN_PC5,
   .pullup_pin   = 0,      /* pull-up driven by UDC */
};



/* These are the partitions I want for the dataflash chip on CS1 */
/* SO how do I link this into the SPI dev??? [b]*/
static struct mtd_partition my_flash1_partitions[] =
{
   /* Note there are 8 pages per block, so put all sections on a block boundary */
   {
      .name = "bootstrap",
      .offset = 0,
      .size = 16 * 1056,/* 16 pages (2blocks) * 1056 bytes = 0x4200 bytes*/
      .mask_flags = MTD_WRITEABLE, /* read-only */
   },
   {
      .name = "uboot_env", /* 0x4200 - defines place u-boot env*/
      .offset = MTDPART_OFS_NXTBLK,
      .size = 16 * 1056, /* 16 pages (2blocks) * 1056 bytes = 0x4200 bytes */
      .mask_flags = MTD_WRITEABLE, /* read-only */
   },
   {
      .name = "loader", /* 0x8400 - defines palce bootstrap loads u-boot from*/
      .offset = MTDPART_OFS_NXTBLK,
      .size = 224 * 1056, /* 224 pages (28blocks) * 1056 bytes = 0x39C00 bytes */
      .mask_flags = MTD_WRITEABLE, /* read-only */
   },
   {
      .name = "linux", /* 0x42000 - defines place u-boot copies kernel from*/
      .offset = MTDPART_OFS_NXTBLK,
      .size = 1536 * 1056, /* 1536 pages (192 blocks) * 1056 bytes = 0x18C000 bytes */
   },
   {
      .name = "rootfs", /* 0x1CE000 - where we put jffs2 root filesystem */
      .offset = MTDPART_OFS_NXTBLK,
//      .size = MTDPART_SIZ_FULL, /* rest = ?? sectors */
      .size = 3072 * 1056, /* 3072 pages (384 blocks) * 1056 bytes = 0x318000 bytes */
   },
   {
      .name = "data", /* 0x4E6000 - where we put jffs2 data filesystem */
      .offset = MTDPART_OFS_NXTBLK,
      .size = MTDPART_SIZ_FULL, /* rest = ?? sectors */
   }
};

static struct flash_platform_data my_flash1_platform = {
   .name = "Onboard dataflash chip",
   .parts = my_flash1_partitions,
   .nr_parts = ARRAY_SIZE(my_flash1_partitions)
};

/*
* SPI devices.
*/
static struct spi_board_info ek_spi_devices[] = {
#if !defined(CONFIG_MMC_AT91)
   {   /* DataFlash chip */
      .modalias   = "mtd_dataflash",
      .chip_select   = 1,
      .max_speed_hz   = 15 * 1000 * 1000,
      .bus_num   = 0,
      .platform_data = &my_flash1_platform,
   },
#if defined(CONFIG_MTD_AT91_DATAFLASH_CARD)
   {   /* DataFlash card */
      .modalias   = "mtd_dataflash",
      .chip_select   = 0,
      .max_speed_hz   = 15 * 1000 * 1000,
      .bus_num   = 0,
   },
#endif
#endif
#if defined(CONFIG_SND_AT73C213) || defined(CONFIG_SND_AT73C213_MODULE)
   {   /* AT73C213 DAC */
      .modalias   = "at73c213",
      .chip_select   = 0,
      .max_speed_hz   = 10 * 1000 * 1000,
      .bus_num   = 1,
   },
#endif
};


/*
* MACB Ethernet device
*/
static struct at91_eth_data __initdata ek_macb_data = {
   .phy_irq_pin   = AT91_PIN_PA7,
   .is_rmii   = 1,
};


/*
* NAND flash
*/
static struct mtd_partition __initdata ek_nand_partition[] = {
   {
      .name   = "Partition 1",
      .offset   = 0,
      .size   = 256 * 1024,
   },
   {
      .name   = "Partition 2",
      .offset   = 256 * 1024,
      .size   = MTDPART_SIZ_FULL,
   },
};

static struct mtd_partition * __init nand_partitions(int size, int *num_partitions)
{
   *num_partitions = ARRAY_SIZE(ek_nand_partition);
   return ek_nand_partition;
}

static struct at91_nand_data __initdata ek_nand_data = {
   .ale      = 21,
   .cle      = 22,
//   .det_pin   = ... not connected
   .rdy_pin   = AT91_PIN_PC13,
   .enable_pin   = AT91_PIN_PC14,
   .partition_info   = nand_partitions,
#if defined(CONFIG_MTD_NAND_AT91_BUSWIDTH_16)
   .bus_width_16   = 1,
#else
   .bus_width_16   = 0,
#endif
};


/*
* MCI (SD/MMC)
*/
static struct at91_mmc_data __initdata ek_mmc_data = {
   .slot_b      = 1,
   .wire4      = 1,
//   .det_pin   = ... not connected
//   .wp_pin      = ... not connected
//   .vcc_pin   = ... not connected
};

static void __init ek_board_init(void)
{
   /* Serial */
   at91_add_device_serial();
   /* USB Host */
   at91_add_device_usbh(&ek_usbh_data);
   /* USB Device */
   at91_add_device_udc(&ek_udc_data);
   /* SPI */
   at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices));
   /* NAND */
   at91_add_device_nand(&ek_nand_data);
   /* Ethernet */
   at91_add_device_eth(&ek_macb_data);
   /* MMC */
//   at91_add_device_mmc(0, &ek_mmc_data);
   /* I2C */
   at91_add_device_i2c(NULL, 0);
}

MACHINE_START(AT91SAM9260EK, "Atmel AT91SAM9260-EK")
   /* Maintainer: Atmel */
   .phys_io   = AT91_BASE_SYS,
   .io_pg_offst   = (AT91_VA_BASE_SYS >> 18) & 0xfffc,
   .boot_params   = AT91_SDRAM_BASE + 0x100,
   .timer      = &at91sam926x_timer,
   .map_io      = ek_map_io,
   .init_irq   = ek_init_irq,
   .init_machine   = ek_board_init,
MACHINE_END


Top
 Profile  
 
 Post subject:
PostPosted: Wed Mar 26, 2008 7:41 pm 
Offline

Joined: Tue Jun 26, 2007 6:27 pm
Posts: 81
Wow, thank you very very much,

great support...

If I compile the mtd_dataflash "inside the kernel" the mtd´s are generated automatically in /dev at system startup.

If I compile the mtd_dataflash as a module and load it later the console shows me that my partitions were generated, but I can´t see them inside the /dev folder !

What could I do ?
Is there a chance to generate them automatically after i load the mtd_dataflash module ?

Thank you

[I´m using mdev]


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 8 posts ] 

All times are UTC + 1 hour [ DST ]


Who is online

Users browsing this forum: Bing [Bot], Exabot [Bot], Google [Bot] and 3 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to: