#151 07/11/2008 15:26:21

lamaatje
Moddeur newbie
Date d'inscription: 06/11/2008
Messages: 7

Re: OpenWRT sur bcm63xx

Network does not work here. Do you guys have same problem?

Hors ligne

 

#152 07/11/2008 15:59:35

SGDA
Pachyderme
Lieu: 95170
Date d'inscription: 28/08/2007
Messages: 8462

Re: OpenWRT sur bcm63xx

I can ping you
Statistiques Ping pour 87.20y.xx.xx
    Paquets : envoyés = 4, reçus = 4, perdus = 0 (perte 0%),
Durée approximative des boucles en millisecondes :
    Minimum = 50ms, Maximum = 57ms, Moyenne = 52ms


XP Pro/Fedora 19 (Schrödinger's cat)

Hors ligne

 

#153 07/11/2008 17:27:57

lamaatje
Moddeur newbie
Date d'inscription: 06/11/2008
Messages: 7

Re: OpenWRT sur bcm63xx

SGDA a écrit:

I can ping you

Congratulations, mhh I don't expect that the 6358 makes the difference....

Hors ligne

 

#154 07/11/2008 19:20:57

lamaatje
Moddeur newbie
Date d'inscription: 06/11/2008
Messages: 7

Re: OpenWRT sur bcm63xx

SGDA a écrit:

Openwrt does it
When he builds the image it puts first kernel then rootfs
In the header one can see that values of address are inverted (not their place int he header
I think this is done because later it will use unionfs with the new partition created after rootfs
I can release a modified version of o(p)b4-concat which does an assembly of squash.rootfs and lzma compressed kernel à la mode Openwrt

When I use cmplzma in the building process of OpenWrt on the correct kernel image then the resulting image wil also be loadable for my ancient CFE, no need to modify nb4-concat.

Hors ligne

 

#155 07/11/2008 19:31:54

SGDA
Pachyderme
Lieu: 95170
Date d'inscription: 28/08/2007
Messages: 8462

Re: OpenWRT sur bcm63xx

J'ai testé les résultats de ioremap avec le code suivant

Code:

#define FLASH_SIZE              ( 0x800000 )
#define WINDOW_ADDR         ( 0x1FC00000 )
#define WINDOW_SIZE           ( 0x400000 )

printk("ioremap %x %x %x \n", ioremap(WINDOW_ADDR, WINDOW_SIZE),WINDOW_ADDR, WINDOW_SIZE);
printk("ioremap %x %x %x \n", ioremap(WINDOW_ADDR, FLASH_SIZE),WINDOW_ADDR, FLASH_SIZE);

voici le résultat

ioremap bfc00000 1fc00000 400000
ioremap c0080000 1fc00000 800000

Que faut-il en penser ?

garder le code d'Openwrt et tricher sur la taille de flash lors du ioremap ?

Je viens d'essayer

Code:

#define WINDOW_ADDR 0x1FC00000         /* Real address of the flash */
#define WINDOW_SIZE 0x400000           /* Size of flash */
#define FLASH_SIZE 0x400000           /* Size of flash */

static struct map_info bcm963xx_map = {
       .name = "bcm963xx",
       .size = FLASH_SIZE,
       .bankwidth = BUSWIDTH,
       .phys = WINDOW_ADDR,
};

..
       bcm963xx_map.virt = ioremap(WINDOW_ADDR, WINDOW_SIZE);

mais bien sur cela ne focntionne pas


XP Pro/Fedora 19 (Schrödinger's cat)

Hors ligne

 

#156 07/11/2008 20:50:57

VincentAlex
Modérateur
Lieu: Massy (91)
Date d'inscription: 01/10/2007
Messages: 3031

Re: OpenWRT sur bcm63xx

Pour en revenir à mon problème, j'ai fait un make V=99

Code:

# Generate the tagged image
/home/godey/dev/openwrt/trunk/staging_dir/host/bin/imagetag -i /home/godey/dev/openwrt/trunk/build_dir/linux-brcm63xx/vmlinux.lzma.cfe -f /home/godey/dev/openwrt/trunk/build_dir/linux-brcm63xx/root.jffs2-64k -o /home/godey/dev/openwrt/trunk/bin/openwrt-96345GW2-jffs2-64k-cfe.bin -b 96345GW2 -c 6345 -e 0x80010000         -l 0x80010000        
Broadcom image tagger - v0.1.0
Copyright (C) 2008 Axel Gembe
*** buffer overflow detected ***: /home/godey/dev/openwrt/trunk/staging_dir/host/bin/imagetag terminated

Apparement, c'est imagetag qui plante !

Problème déjà signalé ! Ticket #4148

C'est un peu couillon, car c'est le imagetag qui marche pas !

En recompilant imagetag, l'overflow est signalé !

Code:

cc -O2 -I/home/godey/dev/openwrt/trunk/staging_dir/host/include -include endian.h -o /home/godey/dev/openwrt/trunk/build_dir/host/firmware-utils/bin/imagetag src/imagetag.c 
src/imagetag.c: In function 'tagfile':
src/imagetag.c:228: warning: format '%lu' expects type 'long unsigned int', but argument 3 has type 'size_t'
src/imagetag.c:238: warning: format '%lu' expects type 'long unsigned int', but argument 3 has type 'size_t'
src/imagetag.c:239: warning: format '%lu' expects type 'long unsigned int', but argument 3 has type 'size_t'
src/imagetag.c:244: warning: format '%lu' expects type 'long unsigned int', but argument 3 has type 'size_t'
src/imagetag.c:245: warning: format '%lu' expects type 'long unsigned int', but argument 3 has type 'size_t'
src/imagetag.c:186: warning: ignoring return value of 'fwrite', declared with attribute warn_unused_result
src/imagetag.c:194: warning: ignoring return value of 'fwrite', declared with attribute warn_unused_result
src/imagetag.c:206: warning: ignoring return value of 'fwrite', declared with attribute warn_unused_result
src/imagetag.c:254: warning: ignoring return value of 'fwrite', declared with attribute warn_unused_result
In function 'strncpy',
    inlined from 'tagfile' at src/imagetag.c:220:
/usr/include/bits/string3.h:122: warning: call to __builtin___strncpy_chk will always overflow destination buffer

Dernière modification par VincentAlex (07/11/2008 22:34:25)


Environnement de développement : MacOsX/Fedora 12
Dépôt dropbox

Hors ligne

 

#157 07/11/2008 22:34:07

SGDA
Pachyderme
Lieu: 95170
Date d'inscription: 28/08/2007
Messages: 8462

Re: OpenWRT sur bcm63xx

avec un peu d'acharnement tu peux le composer à la main
tu  as le rootfs compressé dans  build/linuxyyyy
root.squashfs

le kernel compressé c'est

vmlinux.lzma.cfe

mais il manque l'entête
dans le source de imagetag on peuvoir que l'entête est
/* Build the kernel header */
        khdr.loadaddr   = htonl(loadaddr);
        khdr.entry      = htonl(entry);
        khdr.lzmalen    = htonl(kernellen);


voici la commande imagetag
/opt/pew_openwrt/trunk/staging_dir/host/bin/imagetag -i /opt/pew_openwrt/trunk/build_dir/linux-brcm63xx/vmlinux.lzma.cfe -f /opt/pew_openwrt/trunk/build_dir/linux-brcm63xx/root.squashfs -o /opt/pew_openwrt/trunk/bin/openwrt-96358VW-squashfs-cfe.bin -b 96358VW -c 6358 -e 0x80010000                -l 0x80010000

donc l'entête est
80 01 00 00 80 01 00 00  xx xx xx xx
ou xx xx xx xx est la longueur de vmlinux.lzma.cfe

une fois que tu as le kernel avec entête
tu copies dans une directory
root.squashfs comme OPWRT-ROOTFS
vmlinux.lzma.cfe avec entête comme OPWRT-KERNEL
et tu utilises ceci pour assembler
que j'ai bricolé à partir de nb4-concat
opwrt-concat.c

Code:

/*
 * nb4-concat 0.2
 * Copyright 2007 Ti_dic <ti_dic@hotmail.com>
 * http://www.neufbox4.org
 *
 *
 *
 * 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 3 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, see <http://www.gnu.org/licenses/>.
 *
 */
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <arpa/inet.h>
#include <getopt.h>


#include "./nb4-extract.h"

#define ERASE_SIZE (0x10000)
#define ROUNDUP(x, y) ((((x)+((y)-1))/(y))*(y))

char source_filename[255],firmware_filename[255], rootfs_filename[255], kernel_filename[255];
char data_version[RESERVED_LEN];
uint32_t erase_size = ERASE_SIZE;

static struct option options[] =
{
        {"rootfs",      1,0,'r'},
        {"kernel",      1,0,'k'},
        {"output",      1,0,'o'},
        {"version",     1,0,'v'},
        {"setCRC",      0,0,'s'},
        {"help",        0,0,'h'},
        {0,0,0,0}
};

int empty(char *astring)
{
        return strcmp(astring,"")==0;
}

static void print_usage(const char *name)
{
        printf("Usage: %s [options] NB4-Rx.x.x\n", name);
        printf("Si aucune option n'est précisée, lit les fichiers NB4-Rx.x.x-ROOTFS et NB4-Rx.x.x-KERNEL et génère le fichier NB4-Rx.x.x-MAIN\n");
        printf("Le header est entièrement regénéré, la partie reserved du header est renseigné avec NB4-Rx.x.x-MAIN\n");
        printf("-e, --earse_size= valuer sous la forme 0xyyyy\n    permet de spécifier la valeur du modulo pour aligner la taille de rootfs et du kernel (par défaut 0x10000)\n");
        printf("-r, --rootfs=RootFSFilename\n    permet de spécifier un nom différent pour le fichier contenant le ROOTFS\n");
        printf("-k, --kernel=nom de fichier\n    permet de spécifier un nom différent pour le fichier contenant le KERNEL\n");
        printf("-o, --output=nom de fichier\n    permet de spécifier le nom du fichier de sortie\n");
        printf("-v, --version=Version du firmware\n    permet de spécifier le texte qui sera placé dans la zone version de l'entête\n");
        printf("-h, --help\n    affiche ce texte d'aide\n");
}

void AnalyseCmdLine(int argc, char **argv)
{
        int opt;
        //Analyse des paramètres en ligne de commande
        strcpy(firmware_filename,"");
        strcpy(kernel_filename,"");
        strcpy(rootfs_filename,"");
        strcpy(firmware_filename,"");
        strcpy(data_version,"");
        while (1) {
                int option_index = 0;
                opt = getopt_long(argc, argv, "e:r:k:o:v:sh", options, &option_index);
                if (opt == -1) {
                        break;
                }
                switch (opt) {
                        case 'e':
                                sscanf(optarg,"%x",&erase_size);
                                printf("%s %x \n",optarg,erase_size);
                                break;
                        case 'k':
                                snprintf(kernel_filename, sizeof(kernel_filename), "%s", optarg);
                                break;
                        case 'r':
                                snprintf(rootfs_filename, sizeof(rootfs_filename), "%s", optarg);
                                break;
                        case 'o':
                                snprintf(firmware_filename, sizeof(firmware_filename), "%s", optarg);
                                break;
                        case 'v':
                                snprintf(data_version,RESERVED_LEN,"%s",optarg);
                                break;
                        default :
                                printf("Quelque chose ne va pas dans la ligne de commande\n\n");
                                print_usage(argv[0]);
                                exit(1);
                                break;
                }
        }

        if ((optind>=1) && (optind<argc)) {
                strcpy(source_filename,argv[optind]);
        } else {
                strcpy(source_filename,"");
                if (empty(kernel_filename) || empty(firmware_filename) || empty(rootfs_filename) || empty(data_version)) {
                        printf("\nIl manque le nom du fichier source qui servira a générer les noms de fichiers non précisés ou le numéro de version.\n\n");
                        print_usage(argv[0]);
                        exit(1);
                }
        }
        //Noms de fichiers si ceux-ci n'ont pas été précisés en paramètre
        if (empty(rootfs_filename))
                snprintf(rootfs_filename, sizeof(rootfs_filename), "%s-ROOTFS", source_filename);
        if (empty(kernel_filename))
                snprintf(kernel_filename, sizeof(kernel_filename), "%s-KERNEL", source_filename);
        if (empty(firmware_filename)) 
                snprintf(firmware_filename, sizeof(firmware_filename), "%s-MAIN", source_filename);
        if (empty(data_version))
                snprintf(data_version,RESERVED_LEN,"%s",firmware_filename);
}


uint32_t getCrc32(uint8_t *pdata, uint32_t size, uint32_t crc)
{
    while (size-- > 0)
    {
        crc = (crc >> 8) ^ Crc32_table[(crc ^ *pdata++) & 0xff];
    }

    return htonl(crc);
}

void initHeader(NB4_HEADER *pheader, uint8_t *rootfs, uint32_t rootfssize, uint8_t *kernel, uint32_t kernelsize,char *version)
{

        uint32_t baseaddrrootfs = 0xBFC10100; 
        strncpy((char *)pheader->tagVersion,"6",TAG_VER_LEN);
        strncpy((char *)pheader->signiture_1,"OpenWRT BCM63xx",SIG_LEN);
        strncpy((char *)pheader->signiture_2,"V1",SIG_LEN_2);
        strncpy((char *)pheader->chipId,"6358",CHIP_ID_LEN);
        strncpy((char *)pheader->bigEndian,"1",FLAG_LEN);
        strncpy((char *)pheader->boardId,"96358VW",BOARD_ID_LEN);
        snprintf((char *)pheader->totalImageLen,IMAGE_LEN,"%u",rootfssize+kernelsize);
        strncpy((char *)pheader->cfeAddress,"0",ADDRESS_LEN);
        strncpy((char *)pheader->cfeLen,"0",IMAGE_LEN);
        snprintf((char *)pheader->rootfsAddress,ADDRESS_LEN,"%u",baseaddrrootfs+kernelsize);
        printf("Adresse du rootfs : 0X%x\n",baseaddrrootfs+kernelsize);
        snprintf((char *)pheader->rootfsLen,IMAGE_LEN,"%u",rootfssize);
        snprintf((char *)pheader->kernelAddress,ADDRESS_LEN,"%u",baseaddrrootfs);
        printf("Adresse du KERNEL : 0X%x\n",baseaddrrootfs);
        snprintf((char *)pheader->kernelLen,IMAGE_LEN,"%u",kernelsize);
        if (!empty(version))
                strncpy((char *)pheader->reserved,version,RESERVED_LEN);

        uint32_t crc;
        crc = CRC32_INIT_VALUE;
        crc = getCrc32(kernel, rootfssize+kernelsize, crc);
        printf("crc1 %x \n",crc);
        //stocke les crc
        uint32_t *imgval;
        imgval = (uint32_t *) &(pheader->imageValidationToken);
        *imgval = crc;
        imgval++;
        crc = CRC32_INIT_VALUE;
        crc = getCrc32(rootfs,rootfssize, crc);
        printf("crc2 %x \n",crc);
        *imgval = crc;
        imgval++;
        crc = CRC32_INIT_VALUE;
        crc = getCrc32(kernel,kernelsize, crc);
        printf("crc3 %x \n",crc);
        *imgval = crc;
        //crc du header
        imgval = (uint32_t *) &(pheader->tagValidationToken);
        crc = CRC32_INIT_VALUE;
        crc = getCrc32((uint8_t *)pheader,TAG_LEN-TOKEN_LEN, crc);
        printf("crc4 %x \n",crc);
        *imgval = crc;

}

int main(int argc, char **argv)
{
        FILE *fd;
        AnalyseCmdLine(argc,argv);

        NB4_HEADER *header;
        uint8_t *image,*rootfs, *kernel, *rootfstemp;
        uint32_t firmsize, rootfssize, newrootfssize, kernelsize, newkernelsize;

        //Lecture du fichier rootfs
        fd = fopen(rootfs_filename, "r");
        if (fd == NULL)
        {
                printf("Impossible d'ouvrir le fichier '%s'\n", rootfs_filename);
                print_usage(argv[0]);
                exit(1);
        }
        fseek(fd, 0L, SEEK_END);
        rootfssize = ftell(fd);
        fseek(fd, 0L, SEEK_SET);
        rootfstemp = malloc(rootfssize);
        fread(rootfstemp, 1, rootfssize, fd);
        fclose(fd);

        //Lecture du fichier kernel
        fd = fopen(kernel_filename, "r");
        if (fd == NULL)
        {
                printf("Impossible d'ouvrir le fichier '%s'\n", kernel_filename);
                print_usage(argv[0]);
                exit(1);
        }
        fseek(fd, 0L, SEEK_END);
        kernelsize  = ftell(fd);
        fseek(fd, 0L, SEEK_SET);
        //creation de l'image mémoire pour placer la totalité du firmware
        uint8_t *temp;
        newkernelsize = ROUNDUP(kernelsize+sizeof(NB4_HEADER),erase_size)- sizeof(NB4_HEADER);
        if(newkernelsize != kernelsize)
                printf("agrandissement de kernel pour aligner le kernel sur un modulo 0x%x \n Ancienne taille : %u\n Nouvelle taille : %u\n",erase_size,kernelsize,newkernelsize);

        printf("kernel size %u %u \n",kernelsize, newkernelsize);
        newrootfssize=ROUNDUP(rootfssize,erase_size);
        if(newrootfssize != rootfssize)
                printf("agrandissement de rootfs pour aligner le rootfs sur un modulo 0x%x \n Ancienne taille : %u\n Nouvelle taille : %u\n",erase_size,rootfssize,newrootfssize);
        printf("rootfs size %u %u \n",rootfssize, newrootfssize);
        firmsize = sizeof(NB4_HEADER)+newrootfssize+newkernelsize;
        printf("firmsize size %u \n",firmsize);
        image = malloc(firmsize);
        memset(image,0,firmsize);
        temp = image;
        //position le header dans cette image memoire
        header = (NB4_HEADER *)temp;
        temp += sizeof(NB4_HEADER);
        //positionne le kernel dans l'image memoire
        kernel = temp;
        //charge le kernel
        fread(kernel, 1, kernelsize, fd);
        fclose(fd);
        temp += newkernelsize;
        //positionne le rootfs dans l'image memoire, et le recopie
        rootfs = temp;
        memcpy(rootfs,rootfstemp,rootfssize);
        free(rootfstemp);

        //initialisation du header
        initHeader(header,rootfs,newrootfssize,kernel,newkernelsize,data_version);

        fd = fopen(firmware_filename, "wb");
        if (fd == NULL)
        {
                printf("Erreur à la création de %s\n", firmware_filename);
                exit(2);
        }
        fwrite(image, 1, sizeof(NB4_HEADER)+newrootfssize+newkernelsize, fd);
        fclose(fd);

        printf("Fichier %s créé avec succès\n", firmware_filename);

        free(image);

        exit(0);
}

avec nb4-extract.h

Code:

/*
<:copyright-gpl
 Copyright 2002 Broadcom Corp. All Rights Reserved.

 This program is free software; you can distribute it and/or modify it
 under the terms of the GNU General Public License (Version 2) as
 published by the Free Software Foundation.

 This program is distributed in the hope 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.
:>
*/
//**************************************************************************************
// File Name  : bcmTag.h
//
// Description: add tag with validation system to the firmware image file to be uploaded
//              via http
//
// Created    : 02/28/2002  seanl
//**************************************************************************************

/*
 * nb4-extract
 * Copyright 2007 Goundoulf <goundoulf@gmail.com>
 * http://www.neufbox4.org
 *
 * Basé sur bcmTag.h trouvé sur :
 * https://dev.openwrt.org/browser/trunk/target/
 * linux/brcm63xx-2.6/files/arch/mips/bcm963xx/include/bcmTag.h?rev=6848&format=txt
 *
 */

#ifndef _NB4_EXTRACT_H_
#define _NB4_EXTRACT_H_

#define HEADER_MAGIC                    0x36000000
#define HEADER_MAGIC_SWAP               0x00000036

#define SQUASHFS_MAGIC                  0x73717368
#define SQUASHFS_MAGIC_SWAP             0x68737173

#define bswap_32(x) \
        ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >>  8) | \
         (((x) & 0x0000ff00) <<  8) | (((x) & 0x000000ff) << 24))

#define offset_of(x, y) \
        ((int)((void *) x->y) - (int)((void *) x))

// file tag (head) structure all is in clear text except validationTokens (crc, md5, sha1, etc). Total: 128 unsigned chars
#define TAG_LEN         256
#define TAG_VER_LEN     4
#define SIG_LEN         20
#define SIG_LEN_2       14   // Original second SIG = 20 is now devided into 14 for SIG_LEN_2 and 6 for CHIP_ID
#define CHIP_ID_LEN             6
#define IMAGE_LEN       10
#define ADDRESS_LEN     12
#define FLAG_LEN        2
#define TOKEN_LEN       20
#define BOARD_ID_LEN    16
#define RESERVED_LEN    (TAG_LEN - TAG_VER_LEN - SIG_LEN - SIG_LEN_2 - CHIP_ID_LEN - BOARD_ID_LEN - \
                        (4*IMAGE_LEN) - (3*ADDRESS_LEN) - (3*FLAG_LEN) - (2*TOKEN_LEN))

typedef struct _NB4_HEADER
{
    unsigned char tagVersion[TAG_VER_LEN];       // tag version.  Will be 2 here.
    unsigned char signiture_1[SIG_LEN];          // text line for company info
    unsigned char signiture_2[SIG_LEN_2];        // additional info (can be version number)
    unsigned char chipId[CHIP_ID_LEN];                   // chip id
    unsigned char boardId[BOARD_ID_LEN];         // board id
    unsigned char bigEndian[FLAG_LEN];           // if = 1 - big, = 0 - little endia of the host
    unsigned char totalImageLen[IMAGE_LEN];      // the sum of all the following length
    unsigned char cfeAddress[ADDRESS_LEN];       // if non zero, cfe starting address
    unsigned char cfeLen[IMAGE_LEN];             // if non zero, cfe size in clear ASCII text.
    unsigned char rootfsAddress[ADDRESS_LEN];    // if non zero, filesystem starting address
    unsigned char rootfsLen[IMAGE_LEN];          // if non zero, filesystem size in clear ASCII text.
    unsigned char kernelAddress[ADDRESS_LEN];    // if non zero, kernel starting address
    unsigned char kernelLen[IMAGE_LEN];          // if non zero, kernel size in clear ASCII text.
    unsigned char dualImage[FLAG_LEN];           // if 1, dual image
    unsigned char inactiveLen[FLAG_LEN];         // if 1, the image is INACTIVE; if 0, active
    unsigned char reserved[RESERVED_LEN];        // reserved for later use
    unsigned char imageValidationToken[TOKEN_LEN];// image validation token - can be crc, md5, sha;  for
                                                 // now will be 4 unsigned char crc
    unsigned char tagValidationToken[TOKEN_LEN]; // validation token for tag(from signiture_1 to end of
                                                 // imageValidationToken)
} NB4_HEADER;

#define CRC32_INIT_VALUE 0xffffffff /* Initial CRC32 checksum value */
#define CRC_LEN 4

static unsigned long Crc32_table[256] = {
    0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
    0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
    0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
    0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
    0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
    0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
    0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
    0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
    0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
    0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
    0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
    0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
    0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
    0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
    0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
    0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
    0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
    0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
    0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
    0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
    0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
    0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
    0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
    0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
    0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
    0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
    0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
    0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
    0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
    0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
    0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
    0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
    0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
    0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
    0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
    0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
    0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
    0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
    0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
    0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
    0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
    0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
    0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
    0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
    0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
    0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
    0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
    0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
    0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
    0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
    0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
    0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
    0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
    0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
    0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
    0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
    0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
    0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
    0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
    0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
    0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
    0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
    0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
    0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
};

#endif // _NB4_EXTRACT_H_

Bonne chance


XP Pro/Fedora 19 (Schrödinger's cat)

Hors ligne

 

#158 07/11/2008 22:42:23

VincentAlex
Modérateur
Lieu: Massy (91)
Date d'inscription: 01/10/2007
Messages: 3031

Re: OpenWRT sur bcm63xx

Merci ... j'avais pensé à utiliser celui de Broadcom ... mais je viens de trouver !
Un beau bug (copier collé malheureux) dans imagetag.c : A la ligne 207 c'est la taille de tag.sig1 qui es utilisée à la place de celle de tag.sig2 !!!!

Code:

        /* Build the tag */
205            strcpy(tag.tagver, IMAGETAG_VER);
206            strncpy(tag.sig1, IMAGETAG_MAGIC1, sizeof(tag.sig1) - 1);
207            strncpy(tag.sig2, IMAGETAG_MAGIC2, sizeof(tag.sig1) - 1);
208            strcpy(tag.chipid, chipid);
209            strcpy(tag.boardid, boardid);
210            strcpy(tag.bigendian, "1");
211            sprintf(tag.imagelen, "%lu", kernellen + rootfslen);

On fait comment pour proposer un patch ? wink

Maintenant, ça marche beaucoup mieux smile

Dernière modification par VincentAlex (07/11/2008 23:01:48)


Environnement de développement : MacOsX/Fedora 12
Dépôt dropbox

Hors ligne

 

#159 07/11/2008 22:48:54

SGDA
Pachyderme
Lieu: 95170
Date d'inscription: 28/08/2007
Messages: 8462

Re: OpenWRT sur bcm63xx

plus rapide que moi

Pourquoi j'ai pas de problème alors que j'ai le bug ?


XP Pro/Fedora 19 (Schrödinger's cat)

Hors ligne

 

#160 07/11/2008 22:56:18

VincentAlex
Modérateur
Lieu: Massy (91)
Date d'inscription: 01/10/2007
Messages: 3031

Re: OpenWRT sur bcm63xx

J'ai le dernier jus ubuntu 8.10 installé fraichement...peut être plus sensible !

Bon, la suite à mon retour de week-end à la campagne !
Bon we à tous !

Dernière modification par VincentAlex (07/11/2008 23:20:39)


Environnement de développement : MacOsX/Fedora 12
Dépôt dropbox

Hors ligne

 

#161 08/11/2008 12:17:14

benoitg
Moddeur aficionados
Date d'inscription: 11/10/2008
Messages: 192

Re: OpenWRT sur bcm63xx

@SGDA  :

"voici le résultat

Code:

ioremap bfc00000 1fc00000 400000
ioremap c0080000 1fc00000 800000"

Cela ne me choque pas. D'apres ce que j'ai pu comprendre, ioremap map une zone de memoire physique (le contenu de la fash) dans un espace de la memoire virtuelle afin que certaines methodes de l'API puissent lire et écrire dans cette zone. Si tu appels plusieurs  fois ioremap sur la même zone physique sans désallouer , tu réserveras deux emplacements mémoire différents donc avec deux adresses différentes. La deuxième adresse étant légèrement supérieure à la première plus la taille mémoire réservées.


Par contre, si tu lis le contenu des ces deux zones memoire tu devrais avoir le même contenu qui devrai être le début de la flash donc le CFE.

Dernière modification par benoitg (08/11/2008 12:19:38)

Hors ligne

 

#162 09/11/2008 09:33:28

SGDA
Pachyderme
Lieu: 95170
Date d'inscription: 28/08/2007
Messages: 8462

Re: OpenWRT sur bcm63xx

sous CFE j'obtiens ceci

Code:

CFE>   memshow 0xbe0d0000 20
----------+-------------------------------------------------+-----------------
ADDRESS   : 0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  :      ASCII
----------+-------------------------------------------------+-----------------
BE0D0000h : 73 71 73 68 00 00 01 9E 80 B7 F7 CA 0E BF D8 9B : sqsh............
BE0D0010h : 00 00 11 9C 00 00 00 00 00 00 00 00 00 03 00 00 : ................


CFE> memshow 0xbf0d0000 20
----------+-------------------------------------------------+-----------------
ADDRESS   : 0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  :      ASCII
----------+-------------------------------------------------+-----------------
BF0D0000h : 73 71 73 68 00 00 01 9E 80 B7 F7 CA 0E BF D8 9B : sqsh............
BF0D0010h : 00 00 11 9C 00 00 00 00 00 00 00 00 00 03 00 00 : ................


CFE> memshow 0xbfcd0000 20
----------+-------------------------------------------------+-----------------
ADDRESS   : 0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  :      ASCII
----------+-------------------------------------------------+-----------------
BFCD0000h : 19 85 20 03 00 00 00 0C F0 60 DC 98 FF FF FF FF : .. ......`......
BFCD0010h : FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF : ................

y aurait-il deux copies en mémoire de la flash ?
une en 0xbe00000 et une en 0xbf000000 ???

J'ai utilisé l'adresse 0xbf000000 au lieu de 0xbe000000 dans mon driver et cela boote aussi bien

Pour info j'ai fait imprimer quelques valeurs dans le driver de la distribution broadcom 4

Code:

static struct map_info brcm_physmap_map = {
        .name           = "Physically mapped flash",
        .bankwidth      = 2,
        .read           = brcm_physmap_read16,
        .copy_from      = brcm_physmap_copy_from
};
....

        rootfs_addr = (u_int32_t) simple_strtoul(pTag->rootfsAddress, NULL, 10) + BOOT_OFFSET;
        kernel_addr = (u_int32_t) simple_strtoul(pTag->kernelAddress, NULL, 10) + BOOT_OFFSET;

        brcm_physmap_map.size = kernel_addr - rootfs_addr;
        brcm_physmap_map.map_priv_1 = (unsigned long)rootfs_addr;

        /* Set map_priv_2 to the amount of flash memory that is memory mapped to
         * the flash base address.  On the BCM6338, serial flash parts are only
         * memory mapped up to 1MB even though the flash part may be bigger.
         */
        brcm_physmap_map.map_priv_2 =(unsigned long)kerSysMemoryMappedFlashSizeGet();

        printk("rootfs_addr kernel_addr %x %x \n",rootfs_addr,kernel_addr);
        printk("size priv_1 priv_2 %x %x %x \n",brcm_physmap_map.size, brcm_physmap_map.map_priv_1, brcm_physmap_map.map_priv_2);

Résultat

Code:

bcm963xx_mtd driver v1.0
rootfs_addr kernel_addr be010100 be265100
size priv_1 priv_2 255000 be010100 800000

XP Pro/Fedora 19 (Schrödinger's cat)

Hors ligne

 

#163 09/11/2008 10:20:59

SGDA
Pachyderme
Lieu: 95170
Date d'inscription: 28/08/2007
Messages: 8462

Re: OpenWRT sur bcm63xx

VincentAlex a écrit:

Merci ... j'avais pensé à utiliser celui de Broadcom ... mais je viens de trouver !
Un beau bug (copier collé malheureux) dans imagetag.c : A la ligne 207 c'est la taille de tag.sig1 qui es utilisée à la place de celle de tag.sig2 !!!!

Code:

        /* Build the tag */
205            strcpy(tag.tagver, IMAGETAG_VER);
206            strncpy(tag.sig1, IMAGETAG_MAGIC1, sizeof(tag.sig1) - 1);
207            strncpy(tag.sig2, IMAGETAG_MAGIC2, sizeof(tag.sig1) - 1);
208            strcpy(tag.chipid, chipid);
209            strcpy(tag.boardid, boardid);
210            strcpy(tag.bigendian, "1");
211            sprintf(tag.imagelen, "%lu", kernellen + rootfslen);

On fait comment pour proposer un patch ? wink

Maintenant, ça marche beaucoup mieux smile

J'ai signalé ton post à Florian ... et c'est corrigé


XP Pro/Fedora 19 (Schrödinger's cat)

Hors ligne

 

#164 09/11/2008 19:03:16

SGDA
Pachyderme
Lieu: 95170
Date d'inscription: 28/08/2007
Messages: 8462

Re: OpenWRT sur bcm63xx

SGDA a écrit:

sous CFE j'obtiens ceci

Code:

CFE>   memshow 0xbe0d0000 20
----------+-------------------------------------------------+-----------------
ADDRESS   : 0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  :      ASCII
----------+-------------------------------------------------+-----------------
BE0D0000h : 73 71 73 68 00 00 01 9E 80 B7 F7 CA 0E BF D8 9B : sqsh............
BE0D0010h : 00 00 11 9C 00 00 00 00 00 00 00 00 00 03 00 00 : ................


CFE> memshow 0xbf0d0000 20
----------+-------------------------------------------------+-----------------
ADDRESS   : 0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  :      ASCII
----------+-------------------------------------------------+-----------------
BF0D0000h : 73 71 73 68 00 00 01 9E 80 B7 F7 CA 0E BF D8 9B : sqsh............
BF0D0010h : 00 00 11 9C 00 00 00 00 00 00 00 00 00 03 00 00 : ................


CFE> memshow 0xbfcd0000 20
----------+-------------------------------------------------+-----------------
ADDRESS   : 0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  :      ASCII
----------+-------------------------------------------------+-----------------
BFCD0000h : 19 85 20 03 00 00 00 0C F0 60 DC 98 FF FF FF FF : .. ......`......
BFCD0010h : FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF : ................

y aurait-il deux copies en mémoire de la flash ?
une en 0xbe00000 et une en 0xbf000000 ???

J'ai utilisé l'adresse 0xbf000000 au lieu de 0xbe000000 dans mon driver et cela boote aussi bien

SUite à une discussion avec Florian la double présence de sqsh serait lié au fait d'une banque pourrait servir de secours à l'autre et que l'utilisation d'une adresse erronée pourrait conduire un effacage de la flash ...donc du CFE

PS : j'ai perdu le grub de mon doubel boot donc perdu du temps à réinstaller fedora + backup (pas encore terminé)

Dernière modification par SGDA (09/11/2008 20:27:21)


XP Pro/Fedora 19 (Schrödinger's cat)

Hors ligne

 

#165 10/11/2008 09:31:34

SGDA
Pachyderme
Lieu: 95170
Date d'inscription: 28/08/2007
Messages: 8462

Re: OpenWRT sur bcm63xx

Pour ceux  qui voudraient se lancer
voici un patch à appliquer sur target/linux/brcm63xx sur une distribution fraichemlent téléchargée qui implante un driver mtd pour la nb4 FXC
(corrigé le  25/11 (inversion mtd-nb4.o nb4-mtd.o)

Code:

diff -pruN target/linux/brcm63xx/config-2.6.27 target/linux/brcm63xx_new/config-2.6.27
--- target/linux/brcm63xx/config-2.6.27    2008-11-10 07:47:32.000000000 +0100
+++ target/linux/brcm63xx_new/config-2.6.27    2008-11-10 07:36:19.000000000 +0100
@@ -167,7 +167,8 @@ CONFIG_MODULE_FORCE_LOAD=y
 CONFIG_MODULE_FORCE_UNLOAD=y
 CONFIG_MTD=y
 # CONFIG_MTD_ABSENT is not set
-CONFIG_MTD_BCM963XX=y
+# CONFIG_MTD_BCM963XX is not set
+CONFIG_MTD_NB4=y
 CONFIG_MTD_BLKDEVS=y
 CONFIG_MTD_BLOCK=y
 # CONFIG_MTD_BLOCK2MTD is not set
diff -pruN target/linux/brcm63xx/files/drivers/mtd/maps/nb4-mtd.c target/linux/brcm63xx_new/files/drivers/mtd/maps/nb4-mtd.c
--- target/linux/brcm63xx/files/drivers/mtd/maps/nb4-mtd.c    1970-01-01 01:00:00.000000000 +0100
+++ target/linux/brcm63xx_new/files/drivers/mtd/maps/nb4-mtd.c    2008-11-10 07:38:36.000000000 +0100
@@ -0,0 +1,202 @@
+/*
+ *      neufbox-mtd.c
+ *
+ *      Copyright 2007 Miguel GAIO - Efixo
+ *
+ *      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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/vmalloc.h>
+#include <linux/string.h>
+
+#include <asm/io.h>
+
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/map.h>
+#include <linux/mtd/partitions.h>
+
+#define PFX     "bcm63xx: "
+
+#define ROUNDUP(x, y) ((((x)+((y)-1))/(y))*(y))
+#define IMAGE_LEN 10                   /* Length of Length Field */
+#define ADDRESS_LEN 12                 /* Length of Address field */
+
+// Cas de la NB4
+#define BOOT_ADDR        ( 0xBE000000 )
+#define FLASH_SIZE        ( 0x800000 )
+#define ERASE_SIZE        ( 0x010000 )
+
+#define FLASH_BASE        ( BOOT_ADDR )
+#define ADDR_BASE        ( 0xBFC00000 )
+#define BUSWIDTH         ( 2 )        /* Buswidth */
+
+#define IMAGE_TAG_SIZE        ( 0x000100 )
+#define CFE_OFFSET        ( 0x000000 )
+#define CFE_SIZE        ( 0x010000 )
+// Default values
+#define KERNEL_OFFSET        ( 0x010000 ) 
+#define KERNEL_SIZE        ( 0x0C0000 )
+#define ROOTFS_OFFSET        ( 0x0D0000 ) 
+#define ROOTFS_SIZE        ( 0x130000 )
+
+
+static struct mtd_info *flash;
+
+
+static struct map_info flash_map = {
+    .name = "neufbox flash",
+    .bankwidth = BUSWIDTH,
+    .size = FLASH_SIZE,
+    .map_priv_1 = FLASH_BASE,
+    .virt = FLASH_BASE
+};
+
+
+
+struct mtd_partition flash_partition[] = {
+    {
+     .name = "CFE",
+     .offset = CFE_OFFSET,
+     .size = CFE_SIZE,
+     .mask_flags = MTD_WRITEABLE    /* force read-only */
+     },
+    {
+     .name = "kernel",
+     .offset = CFE_SIZE + IMAGE_TAG_SIZE,
+     .size = KERNEL_SIZE - IMAGE_TAG_SIZE,
+     .mask_flags = MTD_WRITEABLE    /* force read-only */
+     },
+    {
+     .name = "rootfs",
+     .offset = ROOTFS_OFFSET,
+     .size = ROOTFS_SIZE,
+     },
+};
+
+static int bcm963xx_detect_cfe(void)
+{
+       int idoffset = 0x4e0;
+       static char idstring[8] = "CFE1CFE1";
+       char buff[8];
+
+       memcpy(&buff, FLASH_BASE + idoffset, sizeof(buff));
+       return strncmp(idstring,buff,8);
+}
+
+static int __init init_neufbox_physmap(void)
+{
+    struct bcm963xx_cfe_map {
+    unsigned char tagVersion[4];        // Version of the image tag
+    unsigned char sig_1[20];        // Company Line 1
+    unsigned char sig_2[14];        // Company Line 2
+    unsigned char chipid[6];        // Chip this image is for
+    unsigned char boardid[16];        // Board name
+    unsigned char bigEndian[2];        // Map endianness -- 1 BE 0 LE
+    unsigned char totalLength[IMAGE_LEN];    //Total length of image
+    unsigned char cfeAddress[ADDRESS_LEN];    // Address in memory of CFE
+    unsigned char cfeLength[IMAGE_LEN];    // Size of CFE
+    unsigned char rootAddress[ADDRESS_LEN];    // Address in memory of rootfs
+    unsigned char rootLength[IMAGE_LEN];    // Size of rootfs
+    unsigned char kernelAddress[ADDRESS_LEN];    // Address in memory of kernel
+    unsigned char kernelLength[IMAGE_LEN];    // Size of kernel
+    unsigned char dualImage[2];        // Unused at present
+    unsigned char inactiveFlag[2];        // Unused at present
+    unsigned char reserved1[74];        // Reserved area not in use
+    unsigned char imageCRC[4];        // CRC32 of images
+    unsigned char reserved2[16];        // Unused at present
+    unsigned char headerCRC[4];        // CRC32 of header excluding tagVersion
+    unsigned char reserved3[16];        // Unused at present
+    } *buf;
+    unsigned int rootfsaddr, kerneladdr;
+    unsigned int rootfslen, kernellen;
+    int ioaddr;
+
+    flash = do_map_probe("cfi_probe", &flash_map);
+    printk(PFX "flash_map.phys %x\n",flash_map.phys);
+
+    if (flash) {
+        flash->owner = THIS_MODULE;
+
+        if (bcm963xx_detect_cfe() == NULL)
+               {
+            printk(PFX "CFE bootloader detected\n");
+                buf =  vmalloc (sizeof(struct bcm963xx_cfe_map));
+
+                if (!buf)
+                return -ENOMEM;
+
+            ioaddr = FLASH_BASE + CFE_SIZE;
+            memcpy((void *)buf, ioaddr , sizeof(struct bcm963xx_cfe_map));
+
+            printk(PFX "CFE boot tag found with version %s and board type %s.\n",buf->tagVersion,buf->boardid);
+
+// Get the values and calculate
+            sscanf(buf->rootAddress,"%u", &rootfsaddr);
+            sscanf(buf->rootLength, "%u", &rootfslen);
+            sscanf(buf->kernelAddress, "%u", &kerneladdr);
+            sscanf(buf->kernelLength, "%u", &kernellen);
+
+            vfree(buf);
+
+            kernellen = rootfsaddr -kerneladdr;
+            kerneladdr = kerneladdr & ~ADDR_BASE;
+            rootfsaddr = rootfsaddr & ~ADDR_BASE;
+            rootfslen = ROUNDUP(rootfslen,ERASE_SIZE);
+
+            flash_partition[1].offset = kerneladdr;
+            flash_partition[1].size = kernellen;
+            flash_partition[2].offset = rootfsaddr;
+            flash_partition[2].size = rootfslen;
+
+            add_mtd_partitions(flash, flash_partition,
+                ARRAY_SIZE(flash_partition));
+        }
+        else
+        {
+            printk(PFX "CFE bootloader not detected\n");
+            return -EIO;
+        }
+    }
+    else
+    {
+        return -EIO;
+    }
+
+
+    return 0;
+}
+
+
+static void __exit cleanup_neufbox_physmap(void)
+{
+    if (flash) {
+        del_mtd_device(flash);
+        map_destroy(flash);
+    }
+}
+
+
+module_init(init_neufbox_physmap);
+module_exit(cleanup_neufbox_physmap);
+
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Miguel GAIO - Efixo");
+MODULE_DESCRIPTION("Configurable MTD map driver for Neuf Box");
diff -pruN target/linux/brcm63xx/patches-2.6.27/040-bcm963xx_flashmap.patch target/linux/brcm63xx_new/patches-2.6.27/040-bcm963xx_flashmap.patch
--- target/linux/brcm63xx/patches-2.6.27/040-bcm963xx_flashmap.patch    2008-11-10 07:48:43.000000000 +0100
+++ target/linux/brcm63xx_new/patches-2.6.27/040-bcm963xx_flashmap.patch    2008-11-06 18:22:25.000000000 +0100
@@ -13,7 +13,7 @@ Signed-off-by: Axel Gembe <ago@bastart.e
 
 --- a/drivers/mtd/maps/Kconfig
 +++ b/drivers/mtd/maps/Kconfig
-@@ -262,6 +262,13 @@
+@@ -262,6 +262,19 @@
        Flash memory access on 4G Systems MTX-1 Board. If you have one of
        these boards and would like to use the flash chips on it, say 'Y'.
  
@@ -24,6 +24,12 @@ Signed-off-by: Axel Gembe <ago@bastart.e
 +      Flash memory access on BCM963xx boards. Currently only works with
 +      RedBoot and CFE.
 +
++config MTD_NB4
++        tristate "CFI Neuf Box flash MTD partition support"
++        depends on MIPS &&  MTD_CFI && MTD_PARTITIONS && MTD_CFI_AMDSTD
++        help
++          Neuf Box MTD partition
++
  config MTD_DILNETPC
      tristate "CFI Flash device mapped on DIL/Net PC"
      depends on X86 && MTD_CONCAT && MTD_PARTITIONS && MTD_CFI_INTELEXT
@@ -66,8 +72,9 @@ Signed-off-by: Axel Gembe <ago@bastart.e
           * I now think the following is _normal_
 --- linux-2.6.27/drivers/mtd/maps/Makefile    2008-10-10 00:13:53.000000000 +0200
 +++ linux-2.6.27.new/drivers/mtd/maps/Makefile    2008-10-20 14:22:52.000000000 +0200
-@@ -65,3 +65,4 @@
+@@ -65,3 +65,5 @@
  obj-$(CONFIG_MTD_OMAP_NOR)    += omap_nor.o
  obj-$(CONFIG_MTD_INTEL_VR_NOR)    += intel_vr_nor.o
  obj-$(CONFIG_MTD_BFIN_ASYNC)    += bfin-async-flash.o
 +obj-$(CONFIG_MTD_BCM963XX)    += bcm963xx-flash.o
++obj-$(CONFIG_MTD_NB4)        += nb4-mtd.o

comme c'est du copier-coller les TAB sont perdus
l'original ICI

Nota : le driver va lire le TAG de l'image en 0xBE010000, et créer 4 partitions
CFE de 0 à 0x10000
kernel de 10100 à au prochain modulo 0X10000 (erase_size fixé a priori) après le kernel
roofs  jusqu'au prochain modulo 0x10000 après le rootfs
rootfs_data jusqu'à la fin

la création automatique de rootfs_data est liée au paramètre
CONFIG_MTD_ROOTFS_SPLIT=y
présent dans build_dir/linux-brcm63xx/linux-2.6.27.4/.config
je ne sais pas ce qui le crée

SI on veut conserver l'ancien découpage
CFE
kernel
rootfs
openwrt
nvram
on peut envisager facilement l'ajout d'un flag tel que
CONFIG_MTD_NB4_NVRAM
...à condition de savoir desactiver CONFIG_MTD_ROOTFS_SPLIT=y...mais il est possible de créer les partitions openwrt et nvram par dessus rootfs_data.

Bonne compil
les utilisateurs d'une SER attendront le retour d'expérienbce de VincentAlex qui ne drevrait pas tarder

Dernière modification par SGDA (25/11/2008 14:16:46)


XP Pro/Fedora 19 (Schrödinger's cat)

Hors ligne

 

#166 10/11/2008 10:25:58

fxmx86
Administrateur
Date d'inscription: 31/12/2007
Messages: 2891
Site web

Re: OpenWRT sur bcm63xx

Merci SGDA !

J'ai une SER, je vais attendre un peu le retour de VincentAlex avant de me lancer !

Par contre, je n'ai pas de cable série (eh oui, jusqu'à maintenant, je m'en suis passé avec succès !).
Puis je toujours faire l'impasse en l'état actuel de tes avancements, même si je sais qu'au moindre pb, j'y serais obligé ?

PS : par soucis de clarté, n'hésites pas à recréer un post nouveau, avec au début tes derniers avancements, comme je le fais pour le mod ob4. Cela évite aux possibles users de suivre forcément tous les posts pour avoir toutes les billes.


Version NB4 modée :  OB4-FULL+USB-R2.1.6

Hors ligne

 

#167 10/11/2008 10:29:30

SGDA
Pachyderme
Lieu: 95170
Date d'inscription: 28/08/2007
Messages: 8462

Re: OpenWRT sur bcm63xx

Je n'ai toujours pas rechargé une image neuf pour tester


XP Pro/Fedora 19 (Schrödinger's cat)

Hors ligne

 

#168 10/11/2008 11:11:52

fxmx86
Administrateur
Date d'inscription: 31/12/2007
Messages: 2891
Site web

Re: OpenWRT sur bcm63xx

Ce que je voulais dire, c'est :
après l'install du FW openwrt généré suivant tes indications, aurais je un accès en telnet sur 192.168.1.1 ou faudra-t-il passer par tty0 ?

Par ailleurs, pour recharger une image neuf, tu penses que la commande "mtd" de Owrt est utilisable directement ?


Version NB4 modée :  OB4-FULL+USB-R2.1.6

Hors ligne

 

#169 10/11/2008 11:25:29

SGDA
Pachyderme
Lieu: 95170
Date d'inscription: 28/08/2007
Messages: 8462

Re: OpenWRT sur bcm63xx

je testerai


XP Pro/Fedora 19 (Schrödinger's cat)

Hors ligne

 

#170 11/11/2008 00:46:00

VincentAlex
Modérateur
Lieu: Massy (91)
Date d'inscription: 01/10/2007
Messages: 3031

Re: OpenWRT sur bcm63xx

Me revoila !
J'ai commencé un draft de page sur le wiki pour aider la construction d'un firmware openwrt compatible avec la neufbox4. c'est ici ! C'est encore maigre, mais les premières étapes (certainement incomplètes) pour récupérer OpenWRT, configurer et compiler un firmware compatible neufbox4.
A compléter et à corriger : les'étapes 3 et 4 sont pour le moment incomplètes !

Dernière modification par VincentAlex (11/11/2008 00:49:54)


Environnement de développement : MacOsX/Fedora 12
Dépôt dropbox

Hors ligne

 

#171 11/11/2008 08:03:18

SGDA
Pachyderme
Lieu: 95170
Date d'inscription: 28/08/2007
Messages: 8462

Re: OpenWRT sur bcm63xx

As-tu pu booter avec ta SER ?
As-tu dû déclaré quelquechose pour la flash Eon ?


XP Pro/Fedora 19 (Schrödinger's cat)

Hors ligne

 

#172 11/11/2008 11:03:37

VincentAlex
Modérateur
Lieu: Massy (91)
Date d'inscription: 01/10/2007
Messages: 3031

Re: OpenWRT sur bcm63xx

Pas encore essayé, je viens de resortir mon convertisseur USB-Serie pour m'y remettre !
Pour la flash EON, je n'ai pas encore trop regarder. Mais je vais déjà booter sans modif autour ce ça pour voir le comportement.

...

Premier essai non concluant sur SER avec le patch de SGDA ci dessus :

Code:

*** Press any key to stop auto run (9 seconds) ***
Auto run second count down: 0
Booting from image (0xbe0cff00) ...
Code Address: 0x80010000, Entry Address: 0x80010000
Decompression OK!
Entry at 0x80010000
Closing network.
Starting program at 0x80010000
Linux version 2.6.27.4 (root@godey-laptop) (gcc version 4.1.2) #14 Tue Nov 11 11:56:47 CET 2008
Detected Broadcom 0x6358 CPU revision a1
CPU frequency is 300000000 MHz
32MB of RAM installed
board_bcm963xx: CFE version: 1.0.37-6.4
console [early0] enabled
CPU revision is: 0002a010 (Broadcom BCM6358)
board_bcm963xx: board name: 96358VW
Determined physical RAM map:
 memory: 02000000 @ 00000000 (usable)
Initrd not found or empty - disabling initrd
Zone PFN ranges:
  Normal   0x00000000 -> 0x00002000
Movable zone start PFN for each node
early_node_map[1] active PFN ranges
    0: 0x00000000 -> 0x00002000
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 8128
Kernel command line: root=/dev/mtdblock2 rootfstype=squashfs,jffs2 init=/etc/preinit noinitrd console=ttyS0,115200
Primary instruction cache 16kB, VIPT, 2-way, linesize 16 bytes.
Primary data cache 16kB, 2-way, VIPT, cache aliases, linesize 16 bytes
PID hash table entries: 128 (order: 7, 512 bytes)
Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)
Memory: 29980k/32768k available (1859k kernel code, 2788k reserved, 318k data, 120k init, 0k highmem)
Calibrating delay loop... 299.00 BogoMIPS (lpj=598016)
Mount-cache hash table entries: 512
net_namespace: 592 bytes
NET: Registered protocol family 16
registering PCI controller with io_map_base unset
bus: 00 index 0 io port: [8000000, 800ffff]
bus: 00 index 1 mmio: [30000000, 37ffffff]
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 1024 (order: 1, 8192 bytes)
TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
TCP: Hash tables configured (established 1024 bind 1024)
TCP reno registered
NET: Registered protocol family 1
audit: initializing netlink socket (disabled)
type=2000 audit(0.264:1): initialized
squashfs: version 3.0 (2006/03/15) Phillip Lougher
Registering mini_fo version $Id$
JFFS2 version 2.2. (NAND) (SUMMARY)  �© 2001-2006 Red Hat, Inc.
msgmni has been set to 58
io scheduler noop registered
io scheduler cfq registered (default)
bcm63xx_uart.0: ttyS0 at MMIO 0xfffe0100 (irq = 10) is a bcm63xx_uart
console handover: boot [early0] -> real [ttyS0]
bcm63xx_enet MII bus: probed
TCP bic registered
NET: Registered protocol family 17
VFS: Cannot open root device "mtdblock2" or unknown-block(0,0)
Please append a correct "root=" boot option; here are the available partitions:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

Apparement, la détection se serait mal passée sur SER...je gratte smile

Dernière modification par VincentAlex (11/11/2008 12:40:57)


Environnement de développement : MacOsX/Fedora 12
Dépôt dropbox

Hors ligne

 

#173 11/11/2008 19:21:06

fxmx86
Administrateur
Date d'inscription: 31/12/2007
Messages: 2891
Site web

Re: OpenWRT sur bcm63xx

VincentAlex a écrit:

Me revoila !
J'ai commencé un draft de page sur le wiki pour aider la construction d'un firmware openwrt compatible avec la neufbox4. c'est ici ! C'est encore maigre, mais les premières étapes (certainement incomplètes) pour récupérer OpenWRT, configurer et compiler un firmware compatible neufbox4.
A compléter et à corriger : les'étapes 3 et 4 sont pour le moment incomplètes !

Super! Merci pour le wiki !


Version NB4 modée :  OB4-FULL+USB-R2.1.6

Hors ligne

 

#174 11/11/2008 21:20:53

SGDA
Pachyderme
Lieu: 95170
Date d'inscription: 28/08/2007
Messages: 8462

Re: OpenWRT sur bcm63xx

@VincentAlex : peux-tu lire la référence de ta flash sur le composant de ta flash.
tu peux aussi essayer
d'activer
#define DEBUG_CFI_FEATURES
dans
drivers/mtd/chips/cfi_cmdset_0020.c
et
#define DEBUG_CFI
dans
drivers/mtd/chips/cfi_probe.c

... mais je crois qu'il faut que la flash soit déjà reconnue


XP Pro/Fedora 19 (Schrödinger's cat)

Hors ligne

 

#175 11/11/2008 21:32:05

VincentAlex
Modérateur
Lieu: Massy (91)
Date d'inscription: 01/10/2007
Messages: 3031

Re: OpenWRT sur bcm63xx

C'est une EON EN29LV640H-90TCP

L'activation des traces de débug n'ont rien donné. Il faut certainement que la flash soit détectées avant ...

Pour info, le début du boot CFE, y'a des infos curieuses concernant la flash EON, (name = EON FLASH, Id = 0 !)

Code:

CFE version 1.0.37-6.4 for BCM96358 (32bit,SP,BE)
Build Date: Fri Nov 17 13:33:10 CET 2006 (miguel@mgo)
Copyright (C) 2000-2005 Broadcom Corporation.

Boot Address 0xbe000000

Initializing Arena.
Initializing Devices.
Parallel flash device: name EON FLASH, id 0x0000, size 8192KB
100 MB Full-Duplex (auto-neg)
CPU type 0x2A010: 300MHz, Bus: 133MHz, Ref: 64MHz
Total memory: 33554432 bytes (32MB)
                                                                                
Total memory used by CFE:  0x80401000 - 0x80528870 (1210480)                    
Initialized Data:          0x8041E4C0 - 0x8041FF70 (6832)                       
BSS Area:                  0x8041FF70 - 0x80426870 (26880)                      
Local Heap:                0x80426870 - 0x80526870 (1048576)                    
Stack Area:                0x80526870 - 0x80528870 (8192)                       
Text (code) segment:       0x80401000 - 0x8041E4B8 (119992)                     
Boot area (physical):      0x00529000 - 0x00569000                              
Relocation Factor:         I:00000000 - D:00000000

Dernière modification par VincentAlex (11/11/2008 22:00:02)


Environnement de développement : MacOsX/Fedora 12
Dépôt dropbox

Hors ligne

 

Pied de page des forums