搜索
bottom↓
楼主: new.ease

淘宝上的(中基学生电脑(SDA-01) 这个不知是不是可以当ARM学习板。拍了一个

[复制链接]

出0入0汤圆

 楼主| 发表于 2008-10-28 09:38:03 | 显示全部楼层
【398楼】 dack
是的REDBOOT重新MAP了RAM和ROM,下面一些资料:
Memory Maps

The first level page table is located at physical address 0xc0004000. No second level tables are used.

NOTE: The virtual memory maps in this section use a C and B column to indicate whether or not the region is cached (C) or buffered (B).

Physical Address Range     Description
-----------------------    ----------------------------------
0x00000000 - 0x07ffffff    flash
0x08000000 - 0x0fffffff    SA-1111 Board flash
0x10000000 - 0x17ffffff    Board Registers
0x18000000 - 0x1fffffff    Ethernet
0x20000000 - 0x2fffffff    SA-1111 Board PCMCIA
0x30000000 - 0x3fffffff    Compact Flash
0x40000000 - 0x47ffffff    SA-1111 Board
0x48000000 - 0x4bffffff    GFX
0x80000000 - 0xbfffffff    SA-1110 Internal Registers
0xc0000000 - 0xc7ffffff    DRAM Bank 0
0xc8000000 - 0xcfffffff    DRAM Bank 1
0xd0000000 - 0xd7ffffff    DRAM Bank 2
0xd8000000 - 0xdfffffff    DRAM Bank 3
0xe0000000 - 0xe7ffffff    Cache Clean


Virtual Address Range    C B  Description
-----------------------  - -  ----------------------------------
0x00000000 - 0x01ffffff  Y Y  DRAM Bank 0
0x08000000 - 0x0fffffff  Y Y  SA-1111 Board flash
0x10000000 - 0x17ffffff  N N  Board Registers
0x18000000 - 0x1fffffff  N N  Ethernet
0x20000000 - 0x2fffffff  N N  SA-1111 Board PCMCIA
0x30000000 - 0x3fffffff  N N  Compact Flash
0x40000000 - 0x47ffffff  N N  SA-1111 Board
0x48000000 - 0x4bffffff  N N  GFX
0x50000000 - 0x57ffffff  Y Y  flash
0x80000000 - 0xbfffffff  N N  SA-1110 Internal Registers
0xc0000000 - 0xc1ffffff  N Y  DRAM Bank 0
0xe0000000 - 0xe7ffffff  Y Y  Cache Clea

编译U-BOOT时如果是RAM版.注意基址.U-BOOT我没有编译过REDBOOT编译的时候就有专门的RAM版可选.
还有你的的一串数字,那可能是REDBOOT的调试数据.那就是出错了.
这段时间有点忙,没有空来搞.祝你成功.需要什么资料我能找到的,就吼一声息.

出0入0汤圆

发表于 2008-10-28 09:51:49 | 显示全部楼层
顶楼上的,希望各位大侠能有所突破。希望有一天能装Wince

出0入0汤圆

发表于 2008-10-28 10:48:38 | 显示全部楼层
谢谢new.ease ,我搞懂了,那个是mmu映射,u-boot似乎是不用mmu映射的,现在正在按照你的方法dump rom,这样dump非常慢,115200速度估计也需要3个小时,而且关键是不知道有没有丢失数据。dump完了不行就烧个angel调试。反正硬件就接几根线。
早上把u-boot的启动部分代码粗粗看了一遍,原理上没道理不能跑。我有点怀疑是cpu速度不能设太快。等下dump完了,改低一点试试。

uboot不分ram版和rom版,只要基地址设对了,放在rom和ram里都可以运行。放在rom里会自动拷贝到ram里执行。

出0入0汤圆

发表于 2008-10-28 11:46:05 | 显示全部楼层
不是速度问题,因为redboot也用的206M跑的。还要再查查

出0入0汤圆

 楼主| 发表于 2008-10-29 00:51:27 | 显示全部楼层
如果是放到ROM里跑前面可能需要一段码.不然可能连电源都打不开.这段代码.偶也还没有搞明白.你可以反汇编下原机上REDBOOT的前面大概20-30行的代码

出0入0汤圆

发表于 2008-10-29 08:22:51 | 显示全部楼层
uboot前面一段启动代码,基本搞明白了,主要是初始化cpu,dram,串口,mmu等,然后如果是在rom里就复制自身到dram的0xc1f00000处,最后跳到dram里执行,这一段代码我没看出有什么毛病,dram的几个参数和板子上redboot有点不同,但和你修改的redboot的参数差不多,你的redboot可以运行,我想这几个参数应该没大问题,我正在焊wigger,焊好了看能不能跟踪一下,hjtag不支持这个芯片,比较讨厌,angel还要学一下怎么用。

出0入0汤圆

发表于 2008-10-29 14:46:45 | 显示全部楼层
wigger焊好了,不过又有问题,用hjtag检测,说是不认识的设备,本来还挺高兴,因为hjtag不支持这个芯片,不认识就对了。但检测了几次之后发现每次检测的结果都不同,这就奇怪了,而且一检测就板子就重启了。仔细检查了连线没有错。new.ease有空试试用hjtag检测下你的板子,看是不是也是这样的。
我修改了jflash源码,重新编译了一个适合wigger的版本,但也检测不到。读出来的数全部是0。

出0入0汤圆

发表于 2008-10-29 15:51:08 | 显示全部楼层
new.ease能不能把你修改的jflash源码放上来
谢谢

出0入0汤圆

发表于 2008-10-30 10:09:35 | 显示全部楼层
我也入手了一台,请问怎样进行 字符模式?

出0入0汤圆

发表于 2008-10-30 10:40:30 | 显示全部楼层
什么字符模式?你说的是终端窗口吗?开始菜单里面管理工具里面有一个文件浏览(大概是这样的名字),点开后一直走到最上一级目录,然后里面有个bin目录,进去后最下面有个termnel,点一下就进了终端窗口了

出0入0汤圆

 楼主| 发表于 2008-10-30 13:25:39 | 显示全部楼层
//JFLASH V1.2
#define VERSION "1.2"
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <conio.h>
#include "sa1110jtag.h"

#define LPT1 0x3bc        // hardware base address for parallel port
#define LPT2 0x378        // the search order is LPT1 then 2 then 3
#define LPT3 0x278        // first valid address found is used (re-order if needed for multiple ports)

#define SA1110ID    "**** 1001001001100001 00000001001 1"        // JTAG ID-codes for the SA-1110
#define XCR3032XLID "**** 0100100000001110 00001001001 1"        // support both the 'A' and non 'A' versions of the part


#define READ 0                // Flags used to modify the SA-1110 JTAG chain data depending on
#define WRITE 1                // the access mode of the Flash Memory
#define SETUP 2
#define HOLD 3
#define RS 4

#define IP 0                // Flag used when accessing the parallel port
#define RP 1                // RP = 'read port', IP = 'ignore port', using IP will speed access

#define MAX_IN_LENGTH 100 // max length for user input strings
#define STATUS_UPDATE 0.1        // time between updates of program/verify status in seconds

int lpt_address;        // Global variable assigned to parallel port address

FILE *in_file;
int putp(int,int, int);  // writes the JTAG data on the parallel port
void id_command(void);        // issues the JTAG command to read the device ID for all 3 chips
void bypass_all(void);        // issues the JTAG command to put all 3 device in bypass mode
void extest(void);                // issues the JTAG command EXTEST to the SA-1110
DWORD access_rom(int, DWORD, DWORD, int);        // Passes read/write/setup data for the Flash memory
DWORD access_bus(int, DWORD, DWORD, int);        // Read/write access to the SA-1110 pins
int test_port(void);        // Looks for and finds a valid parallel port address
int check_id(char*);        // Compares the device IDs for the 3 JTAG chips to expected values
void error_out(char*);        // Prints error and exits program
void erase_flash(DWORD, DWORD, DWORD, DWORD, int);
void program_flash(DWORD, DWORD, DWORD);
void verify_flash(DWORD, DWORD);
void read_flash(DWORD, DWORD);
void test_logic_reset(void);
void test_lock_flash(DWORD, DWORD, DWORD, DWORD, int);
void set_lock_flash(DWORD, DWORD, DWORD, DWORD, int);


int main( int argc, char *argv[] )
{
        time_t start;
        printf("JFLASH Version %s\n",VERSION);

//Test operating system, if WinNT or Win2000 then get device driver handle
        OSVERSIONINFO osvi;
        osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        GetVersionEx(&osvi);
        if(osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
                {
                HANDLE h;

                h = CreateFile("\\\\.\\giveio", GENERIC_READ, 0, NULL,
                                        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
                if(h == INVALID_HANDLE_VALUE)
                        error_out("Couldn't access giveio device");
                CloseHandle(h);
                }

        lpt_address = test_port();        // find a valid parallel port address
        if(!lpt_address)
                error_out("Error, unable to find parallel port");

        char filename[MAX_IN_LENGTH];
        if(argc>= 2)
                strcpy_s(filename,argv[1]);
        else
                {
                printf("enter binary file name: ");
                gets_s(filename);
                }

        test_logic_reset();

        id_command();
        bypass_all();

        access_rom(SETUP, 0, 0x500050L, IP); // clear status register
        access_rom(WRITE, 0, 0x500050L, IP);
        access_rom(HOLD, 0, 0x500050L, IP);

        access_rom(SETUP, 0, 0x980098L, IP); // read query
        access_rom(WRITE, 0, 0x980098L, IP);
        access_rom(HOLD, 0, 0x980098L, IP);

        // To read data from the Flash Memory you must first fill the SA-1110 JTAG chain
        // with the Address, then pump the entire chain out.
        // however while pumping data out you can be pumping the next cycle's Address in
        // Therefore the JTAG chain looks like a pipeline, valid read data always coming
        // out one cycle late.

        // Note that both Flash Memory devices are accessed in parallel (i.e. 32 data bits)
        access_rom(READ, 0x10, 0, IP);  // Test to see if the Flash supports Query Structured Output
        if(access_rom(READ, 0x11, 0, RP) != 0x510051L) //Q
                error_out("error reading flash attribute space\ncheck cables, power and flash sockets");
        if(access_rom(READ, 0x12, 0, RP) != 0x520052L) //R
                error_out("error reading flash attribute space R");
        if(access_rom(READ, 0x25, 0, RP) != 0x590059L) //Y
                error_out("error reading flash attribute space Y\n");

        DWORD max_erase_time = access_rom(READ, 0x27, 0, RP);  // "n" such that the max block erase time = 2^n
        if((max_erase_time & 0xffffL) != (max_erase_time>> 16)) // both devices should be the same time
                error_out("error, max erase time of E11 and E12 are different");
        max_erase_time = 1 << (max_erase_time & 0xffffL);  // convert erase time 2^n to the number of seconds

        DWORD dsize = access_rom(READ, 0x2a, 0, RP);  // "n" such that the device size = 2^n in number of bytes
        if((dsize & 0xffffL) != (dsize>> 16)) // both devices should be the same size
                error_out("error, device size of E11 and E12 are different");
        dsize = 1 << (dsize & 0xffffL);  // convert data size from 2^n to the number of bytes

        DWORD max_write_buffer = access_rom(READ, 0x2d, 0, RP);  // "n" such that the max num of bytes in write buffer = 2^n
        if((max_write_buffer & 0xffffL) != (max_write_buffer>> 16)) // both devices should have the same write buffer size
                error_out("error, write buffer size of E11 and E12 are different");
        max_write_buffer = (1 << (max_write_buffer & 0xffffL)) / 2;  // convert from 2^n bytes to the number of words

        int nblocks = access_rom(READ, 0x2e, 0, RP);  // get the number of erase blocks in Flash - 1
        if((nblocks & 0xffffL) != (nblocks>> 16))        // both devices should have the same number
                error_out("error, number of blocks of E11 and E12 are different");
        nblocks = (nblocks & 0xffffL) + 1L;  // need to add '1' for true number

        int block_number = 0;
        DWORD block_size = dsize / 2 / nblocks;
        printf("Number of blocks in device = %ld\n",nblocks);
        printf("Block size = %ld 0x%lx\n",block_size,block_size);
        printf("Device size = %ld 0x%lx\n",dsize,dsize);

        if(argc>= 4)
                block_number = atoi(argv[3]);
        DWORD base_address = block_number * block_size;

        if(block_number>= nblocks || block_number < 0)
                error_out("error specifying block number");

        if(argc>= 5)
                block_number = atoi(argv[4]);
        DWORD rsize = block_number * block_size;

        if(block_number> nblocks || block_number < 0)
                error_out("error specifying block number");


        char option = 'R';
        if(argc>= 3)
                option = toupper(*argv[2]);
        if(option == 'R')
        {
                
                fopen_s(&in_file,filename, "wb" );
                if( in_file == NULL)
                        error_out("error, can not open binary input file");
                access_rom(SETUP, 0, 0xff00ffL, IP); // put back into read mode
                access_rom(WRITE, 0, 0xff00ffL, IP);
                access_rom(HOLD, 0, 0xff00ffL, IP);

                access_rom(READ, base_address, 0x0L, IP); //extra read to get the pipeline going

                time(&start);

                read_flash(base_address, rsize);

                fclose(in_file);
        }

        if(option == 'P')
        {
                DWORD fsize = 0;
                DWORD last_non_zero = 0 ;
                DWORD last_non_ff = 0;
                DWORD li;
                fopen_s(&in_file,filename, "rb" );
                if( in_file == NULL)
                        error_out("error, can not open binary input file");
                for(;;)
                {
                        int n = fread((DWORD *)&li, sizeof(DWORD) , 1, in_file);
                        if(feof(in_file))break; // Any bytes not on a 4 byte boundry at end-of-file will be ignored
                        fsize++;
                        if(li != 0 && li != 0xffffffff) // Find point in file were only 0's and ff's remain
                                last_non_zero = fsize;
                        if(li != 0xffffffff)  // Find point in file were only ff's remain
                                last_non_ff = fsize;
                }

                rewind(in_file);

                if(fsize * 2> dsize)
                        error_out("error, file size is bigger than device size");
                fsize = last_non_ff;  // Don't wast time programming ff's at the end of the file this is the erase state


                if(100 - (last_non_zero * 100)/last_non_ff> 20)
                {
                        printf("The last %2ld percent of image file is all zeros\n",100 - (last_non_zero * 100)/last_non_ff);
                        printf("Would you like to save time by not programming that area? [y/n]: ");
                        if(toupper(_getche()) == 'Y')
                                fsize = last_non_zero;
                }

                printf("\n");

                test_lock_flash(base_address, fsize, block_size, max_erase_time, block_number);
                erase_flash(base_address, fsize, block_size, max_erase_time, block_number);
                program_flash(max_write_buffer, base_address, fsize);
                access_rom(SETUP, 0, 0xff00ffL, IP); // put back into read mode
                access_rom(WRITE, 0, 0xff00ffL, IP);
                access_rom(HOLD, 0, 0xff00ffL, IP);

                access_rom(READ, base_address, 0x0L, IP); //extra read to get the pipeline going

                time(&start);

                verify_flash(base_address, fsize);

                fclose(in_file);
        }

        test_logic_reset();
        
}

int putp(int tdi, int tms, int rp)
{
// Cable used had 100 ohm resistors between the following pins
// (Cable shipped as part of SA-1110 Development Kit)
// Output pins (LPT driving)
// LPT D0 Pin 2 and TCK J10 Pin 4
// LPT D1 Pin 3 and TDI J10 Pin 11
// LPT D2 Pin 4 and TMS J10 Pin 9
//
// Input pin (SA-1110 board drives)
// LPT Busy Pin 11 and TDO J10 Pin 13

        int tdo = -1;
        _outp(lpt_address, tms*4+tdi*2);        // TCK low
        _outp(lpt_address, tms*4+tdi*2+1);        // TCK high
        if(rp == RP)_outp(lpt_address, tms*4+tdi*2);        // TCK low
        if(rp == RP)tdo = !((int)_inp(lpt_address + 1)>> 7);        // get TDO data
        return tdo;

}

void id_command(void)
{
        putp(1,0,IP);        //Run-Test/Idle;使JTAG复位
        putp(1,0,IP);        //Run-Test/Idle
        putp(1,0,IP);        //Run-Test/Idle
        putp(1,0,IP);        //Run-Test/Idle
        putp(1,1,IP);
        putp(1,1,IP);        //select IR scan;选择指令寄存器
        putp(1,0,IP);        //capture IR;捕获指令寄存器
        putp(1,0,IP);        //shift IR;移位指令寄存器

        putp(0,0,IP);        //SA1110 IDCODE;SA1110JTAG口指令长度5位,IDCODE为00110
        putp(1,0,IP);        //
        putp(1,0,IP);        //
        putp(0,0,IP);        //
        putp(0,0,IP);        //

        putp(1,0,IP);        //XCR3032 IDCODE为00001
        putp(0,0,IP);        //
        putp(0,0,IP);        //
        putp(0,0,IP);        //
        putp(0,0,IP);        //

        putp(1,0,IP);        //XCR3032 IDCODE
        putp(0,0,IP);        //
        putp(0,0,IP);        //
        putp(0,0,IP);        //
        putp(0,1,IP);        //Exit1-IR;退出指令寄存器

        putp(1,1,IP);        //Update-IR;更新指令寄存器,执行指令寄存器中的指令
        putp(1,0,IP);        //Run-Test/Idle
        putp(1,0,IP);        //Run-Test/Idle
        putp(1,0,IP);        //Run-Test/Idle
        putp(1,1,IP);
        putp(1,0,IP);

        if(check_id(SA1110ID))
                error_out("failed to read device ID for the SA-1110");
        if(check_id(XCR3032XLID))
                error_out("failed to read device ID for the XCR3032XL");
        if(check_id(XCR3032XLID))
                error_out("failed to read device ID for the XCR3032XL");

        putp(1,1,IP);        //Exit1-DR;退出数据寄存器
        putp(1,1,IP);        //Update-DR;更新数据寄存器
        putp(1,0,IP);        //Run-Test/Idle
        putp(1,0,IP);        //Run-Test/Idle
        putp(1,0,IP);        //Run-Test/Idle

}

void bypass_all(void)
{
        putp(1,0,IP);        //Run-Test/Idle
        putp(1,0,IP);        //Run-Test/Idle
        putp(1,0,IP);        //Run-Test/Idle
        putp(1,0,IP);        //Run-Test/Idle
        putp(1,1,IP);
        putp(1,1,IP);        //select IR scan
        putp(1,0,IP);        //capture IR
        putp(1,0,IP);        //shift IR

        putp(1,0,IP);        //SA1110 BYPASS
        putp(1,0,IP);        //
        putp(1,0,IP);        //
        putp(1,0,IP);        //
        putp(1,0,IP);        //

        putp(1,0,IP);        //XCR3032 BYPASS
        putp(1,0,IP);        //
        putp(1,0,IP);        //
        putp(1,0,IP);        //
        putp(1,0,IP);        //

        putp(1,0,IP);        //XCR3032 BYPASS
        putp(1,0,IP);        //
        putp(1,0,IP);        //
        putp(1,0,IP);        //
        putp(1,1,IP);        //Exit1-IR

        putp(1,1,IP);        //Update-IR
        putp(1,0,IP);        //Run-Test/Idle
        putp(1,0,IP);        //Run-Test/Idle
        putp(1,0,IP);        //Run-Test/Idle

}

void extest(void)
{
        putp(1,0,IP);        //Run-Test/Idle
        putp(1,0,IP);        //Run-Test/Idle
        putp(1,0,IP);        //Run-Test/Idle
        putp(1,0,IP);        //Run-Test/Idle
        putp(1,1,IP);
        putp(1,1,IP);        //select IR scan
        putp(1,0,IP);        //capture IR
        putp(1,0,IP);        //shift IR

        putp(0,0,IP);        //SA1110 extest
        putp(0,0,IP);        //
        putp(0,0,IP);        //
        putp(0,0,IP);        //
        putp(0,0,IP);        //

        putp(1,0,IP);        //XCR3032 BYPASS
        putp(1,0,IP);        //
        putp(1,0,IP);        //
        putp(1,0,IP);        //
        putp(1,0,IP);        //

        putp(1,0,IP);        //XCR3032 BYPASS
        putp(1,0,IP);        //
        putp(1,0,IP);        //
        putp(1,0,IP);        //
        //putp(1,0,IP);        //

        putp(1,1,IP);        //Exit1-IR

        putp(1,1,IP);        //Update-IR
        putp(1,0,IP);        //Run-Test/Idle
        putp(1,0,IP);        //Run-Test/Idle
        putp(1,0,IP);        //Run-Test/Idle

}

DWORD access_rom(int rw, DWORD address, DWORD data, int rp)
{
        // Shift Flash address making A2 the LSB
        return(access_bus(rw, address << 2, data, rp));
}

DWORD access_bus(int rw, DWORD address, DWORD data, int rp)
{
        // Preset SA-1110 pins to default values (all others set in sa1110jtag.h)
        pin[nCS0_OUT] = 1;
        pin[nCS1_OUT] = 1;
        pin[nCS2_OUT] = 1;
        pin[nCS3_OUT] = 1;
        pin[nCS4_OUT] = 1;
        pin[nCS5_OUT] = 1;

        pin[nOE_OUT] = 0;
        pin[nWE_OUT] = 1;
        pin[RD_nWR_OUT] = 0;

        pin[D31_0_EN] = 1;

        for(int i = 0; i < 26; i++)
                pin[i+28] = (int)((address>> i) & 1);        // set address 0 thru 25

        if(rw == READ)
        {
                pin[RD_nWR_OUT] = 1;

                switch(address>> 27)
                {
                        case 0:{pin[nCS0_OUT] = 0; break;}
                        case 1:{pin[nCS1_OUT] = 0; break;}
                        case 2:{pin[nCS2_OUT] = 0; break;}
                        case 3:{pin[nCS3_OUT] = 0; break;}
                        case 4:{pin[nCS4_OUT] = 0; break;}
                        case 5:{pin[nCS5_OUT] = 0; break;}
                }
        }

        if(rw == WRITE)
        {
                pin[nWE_OUT] = 0;
                pin[nOE_OUT] = 1;
                pin[D31_0_EN] = 0;  // switch data pins to drive
                switch(address>> 27)  // set CS pin for corresponding address
                {
                        case 0:{pin[nCS0_OUT] = 0; break;}
                        case 1:{pin[nCS1_OUT] = 0; break;}
                        case 2:{pin[nCS2_OUT] = 0; break;}
                        case 3:{pin[nCS3_OUT] = 0; break;}
                        case 4:{pin[nCS4_OUT] = 0; break;}
                        case 5:{pin[nCS5_OUT] = 0; break;}
                }

                for(DWORD li = 0L; li < 32L; li++)
                        pin[dat_order[li]] = (int)((data>> li) & 1L);        // set data pins
        }

        if(rw == SETUP || rw == HOLD)        // just like a write except WE, WE needs setup time
        {
                pin[nOE_OUT] = 1;
                pin[D31_0_EN] = 0;
                for(DWORD li = 0L; li < 32L; li++)
                        pin[dat_order[li]] = (int)((data>> li) & 1L);        // serialize data pins
        }

        if(rw == RS)        // setup prior to RD_nWR_OUT
        {
                pin[nOE_OUT] = 1;
        }

        putp(1,0,IP);        //Run-Test/Idle
        putp(1,0,IP);        //Run-Test/Idle
        putp(1,0,IP);        //Run-Test/Idle
        putp(1,0,IP);        //Run-Test/Idle
        putp(1,1,IP);        //select DR scan
        putp(1,0,IP);        //capture DR
        putp(1,0,IP);        //shift IR

        int out_dat[300];
        for(int i = 0; i < 291; i++)        // shift write data in to JTAG port and read data out
                out_dat = putp(pin,0,rp);

        putp(0,0,IP);
        putp(0,0,IP);
        putp(0,1,IP);        //Exit1-DR
        putp(1,1,IP);        //Update-DR
        putp(1,0,IP);        //Run-Test/Idle
        putp(1,0,IP);        //Run-Test/Idle
        putp(1,0,IP);        //Run-Test/Idle

        DWORD busdat = 0;

        for(int i = 0; i < 32; i++)        // convert serial data to single DWORD
        {
                busdat = busdat | (DWORD)(out_dat[dat_order - 2] << i);
        }
        extest();
        return(busdat);
}
int test_port(void)
{
        // search for valid parallel port
                _outp(LPT1, 0x55);
                if((int)_inp(LPT1) == 0x55)return LPT1;
                _outp(LPT2, 0x55);
                if((int)_inp(LPT2) == 0x55)return LPT2;
                _outp(LPT1, 0x55);
                if((int)_inp(LPT3) == 0x55)return LPT3;
        return(0);        // return zero if none found
}

int check_id(char *device_id)
{
        // compare passed device ID to the one returned from the ID command
        char in_id[40];
        BOOL error_flag = FALSE;


        for(int i = 34; i>= 0; i--)
        {
                if(i == 4 || i == 21 || i == 33)
                {
                        in_id = ' ';
                        i--;
                }
                if(putp(1,0,RP) == 0)
                        in_id = '0';
                else
                        in_id = '1';

                if((in_id != *(device_id + i)) && (*(device_id + i) != '*'))
                {
                        error_flag = TRUE;
                        
                }
        }
        in_id[35] = 0;

        
        if(error_flag)
        {
                printf("error, failed to read device ID\n");
                printf("check cables and power\n");
                printf("ACT: %s\n",in_id);
                printf("EXP: %s\n\n",device_id);
                return -1;
        }

        if(!strcmp(device_id,SA1110ID))        // print SA-1110 device revision
        {
                int sa_rev =
                        (int)(in_id[0] - '0') * 8 +
                        (int)(in_id[1] - '0') * 4 +
                        (int)(in_id[2] - '0') * 2 +
                        (int)(in_id[3] - '0');
                switch(sa_rev)
                {
                        case 0: printf("SA-1110 revision A0\n"); break;
                        case 4: printf("SA-1110 revision B0\n"); break;
                        case 5: printf("SA-1110 revision B1\n"); break;
                        case 6: printf("SA-1110 revision B2\n"); break;
                        case 8: printf("SA-1110 revision B4\n"); break;
                        default: printf("SA-1110 revision B4 + %d\n",sa_rev - 8);
                }

        }        

        return 0;
}
void error_out(char *error_string)
{
        printf("%s\n",error_string);
        exit(0);
}

void erase_flash(DWORD base_address, DWORD fsize, DWORD block_size, DWORD max_erase_time, int block_number)
{
        time_t start, now;

        printf("Starting erase\n");

        for(DWORD lj = base_address; lj < fsize + base_address; lj = lj + block_size)  // Erase only blocks to be programmed
                {
                access_rom(SETUP, 0, 0x200020L, IP); // Erase block command
                access_rom(WRITE, 0, 0x200020L, IP);
                access_rom(HOLD, 0, 0x200020L, IP);

                access_rom(SETUP, lj, 0xd000d0L, IP); // Erase confirm at the block address
                access_rom(WRITE, lj, 0xd000d0L, IP);
                access_rom(HOLD, lj, 0xd000d0L, IP);

                time(&start);
                printf("Erasing block %3d   \r",block_number++);
                while(access_rom(RS, 0, 0, RP) != 0x800080L)        // Loop until successful status return
                        {
                        access_rom(READ, 0, 0, RP);
                        time(&now);
                        if(difftime(now,start)> max_erase_time + 1)        // Check for erase timeout
                                error_out("Error, Block erase timed out");
                        }
                }
        printf("Erasing done                                           \n");
}

void program_flash(DWORD max_write_buffer, DWORD base_address, DWORD fsize)
{
        time_t start, now;
        DWORD li;
        printf("Starting programming\n");


        // "Write Buffer" flow.
        // This uses almost half the cycles required by "word programming" flow
        // Status register is not read to save time.  There is also no checking to see
        // if maximum "Write Buffer Program Time" is violated.  However even with the
        // fastest parallel port bus speed this should not be a problem
        // (i.e. 16 words * 300 JTAG chain length * 4 parallel port cycles * 1uS fast
        // parallel port cycle = 19mS, typical write buffer program times are in the 200uS range).

        DWORD write_word_count = (max_write_buffer - 1) + ((max_write_buffer - 1) << 16);
        time(&start);

        for(DWORD lj = base_address; lj < fsize + base_address; lj = lj + max_write_buffer)
         &nb

出0入0汤圆

 楼主| 发表于 2008-10-30 13:30:35 | 显示全部楼层
为了改这段代码一夜没睡.

出0入0汤圆

发表于 2008-10-30 13:41:47 | 显示全部楼层
谢谢,那个读的功能是你自己加上去的吗?我从网上找了很多版本,都不能读


本贴被 dack 编辑过,最后修改时间:2008-10-30,13:43:57.

出0入0汤圆

发表于 2008-10-30 17:32:27 | 显示全部楼层
/*什么字符模式?你说的是终端窗口吗?开始菜单里面管理工具里面有一个文件浏览(大概是这样的名字),点开后一直走到最上一级目录,然后里面有个bin目录,进去后最下面有个termnel,点一下就进了终端窗口了 */

果然,之前在[文件夹]中无法回到根目录就放弃了,U盘大部分时间不认,绕了个弯:从PC上 Telnet 进去,再用 FTP get 文件进去。

出0入0汤圆

发表于 2008-10-31 10:58:20 | 显示全部楼层
按照new.ease的说明,把angel写进了flash,本想用gdb来调试,结果我手上有的这个新版gdb竟然取消了target rdi。好不容易下了个ads装上了,但axd竟然连不上。难道是usb转的串口不行?看了看axd,有仿真选项,干脆用仿真试试,把u-boot load进去,单步run,可以跑。跟踪到一个延时函数死循环,一看0x90000010 OSCR寄存器值不变,这个本应该是一个free run的up计数器,不应该这样的,难道是仿真没这个功能,不应该呀,改了几个设置,还是不行。对了new.ease:你的那个说明似乎有两个笔误,一个是备份flash时最后一个参数应该是128,127的话会少备份256k,另一个是安装angel时安装的文件不是strong\swsup\downloads\ebsaangel1_2.exe,而应该是strong\swsup\downloads\SA1110AngelKit.exe。
我感觉我是这个世界上人品最差的人了,无论做什么都不顺,即使做new.ease做过有详细说明的步骤都会出很多问题。

出0入0汤圆

发表于 2008-10-31 11:04:10 | 显示全部楼层
刚发完贴,就可以连上了,用strong\swsup\downloads\SA1110AngelKit_207d.exe里的angel就连上了
头像被屏蔽

出0入0汤圆

发表于 2008-11-1 22:10:55 | 显示全部楼层
以下蓝色文字由坛主:armok 于:2008-11-01,22:10:55 加入。
<font color=black>请发贴人注意:
本贴放在这分区不合适,即将移走
原来分区:[9999]ARM技术论坛
即将移去的分区:[3031]淘宝超值宝贝推介
移动执行时间:自本贴发表0小时后

任何的疑问或咨询,请可随时联系站长。谢谢你的支持!
</font>

出0入0汤圆

发表于 2008-11-3 10:04:26 | 显示全部楼层
继续等,

出0入0汤圆

发表于 2008-11-3 15:37:19 | 显示全部楼层
移植u-boot算是可以跑了,本以为很简单,结果搞了好多天才搞成被阉割的u-boot。bootloader太难调试了,用angel的话有些寄存器不能用,一动angel就死了。最后只能用电源灯来调,一开始没发现如果你这次点亮了灯,下次再编译一个点不亮的,直接烧上去灯还是亮的。就是说复位的时候灯不会自己灭掉,结果浪费了很多时间。
现在把网卡屏蔽掉后,烧到flash了,可以出命令行了。不过这样的结果肯定不行,没有网卡的支持,后期开发会浪费太多时间。
不过加网卡很难,网上连这个芯片的资料都没有。现在只能幻想它和91c96兼容了,呵呵。
现在加上网卡的话,调试时操作0x18000000段(assabet网卡地址)会出data&nbsp;异常,是不是网卡地址改了呢?还没想出办法查出网卡地址。

出0入0汤圆

发表于 2008-11-4 08:04:20 | 显示全部楼层
请问还有什么可用的For&nbsp;SDA-01应用软件吗?暂时不拆机,先玩几天再说。

出0入0汤圆

发表于 2008-11-4 08:11:03 | 显示全部楼层
to:楼上的,你想要要什么软件?你可以搞一个工具链自己从源代码编译。

to:all,怎样搞清楚网卡是怎样驱动的?我现在一点思路都没有,大家有什么想法可以说说。

出0入0汤圆

发表于 2008-11-4 16:36:10 | 显示全部楼层
今天量了一天的引脚,91c93和91c96基本上就是旋转了180度,地址线,数据线,led,eeprom等都对得上,地线似乎有一根对不上。如果真是旋转180度的话,现在的接法是local&nbsp;bus的接法,assabet的接法是pcmcia的接法,都是8位数据,连到数据总线上。地址线的接法不同,assabet是接了a0-a9,a15,a19(这个接的片选),这个呢只接了a0-a9,其他全部接地。aen是接地,nCE2上拉,好像没接别的东西,nOE接高,nIORD和nIOWR不知道接到那里去了,估计是接到gpio上去了,找到这两根线就应该可以驱动了。但是现在没办法量出来,那就麻烦了。
new&nbsp;ease:你上次把91c93反过来后有没有烧坏,后来怎么处理了?

出0入0汤圆

发表于 2008-11-4 18:30:52 | 显示全部楼层
赞下dack的钻研精神。

最近我只测试了下原系统的usb功能:
1:u盘和移动硬盘都没问题(硬盘在界面下只能查看第一分区)
2:usb光驱不行
3:读卡器只能mount一次,拔下再插上后mount不成功
4:支持usbhub,能通过usbhub读u盘或硬盘,但界面下只能查看hub上的单个设备上的文件


本贴被 ourfxt 编辑过,最后修改时间:2008-11-04,18:31:11.

出0入0汤圆

发表于 2008-11-5 08:30:29 | 显示全部楼层
to:ourfxt:说实在的,我买这个就是要当开发板用的,用的话我有两个pda,这个用起来实在是烂,尤其是触摸屏定位不准,那个软键盘能把人搞疯,触摸屏还经常死掉。如果你那里方便,倒是可以试一下能不能接usb键盘,能接的话,至少在term里输入命令就方便去多。

网卡不搞定的话,后续很麻烦,今天还是想办法搞网卡。

出0入0汤圆

发表于 2008-11-5 11:36:58 | 显示全部楼层
PS/2&nbsp;键盘接口呀!

出0入0汤圆

发表于 2008-11-5 13:39:24 | 显示全部楼层
啊,我咋忘了还有这么个接口呢。
今天研究91c96的datasheet,基本了解了怎么运作的,但io定义还没搞清,而且91c93是不是一样的也还很难说,smsc公司91c90-91c96都有,除了91c93,真是奇怪。有谁和smsc代理有联系的可以帮忙问一下有没有91c93的datasheet。
这块板子上的91c93地址线很奇怪,只接了a0-a9,其他全部接地。不知道怎么才能片选这个芯片。

出0入0汤圆

 楼主| 发表于 2008-11-5 16:11:47 | 显示全部楼层
【411楼】&nbsp;dack:读功能是我自己加上去的。
【413楼】&nbsp;dack:其实是写程序的的时候的BUG只能读127个块。后来才改好的。
【420楼】&nbsp;dack:十分的高烧。但不知道烧坏没有。本来就用不了才死马当活马医的。后来接反回来,居然和以前一样,用测试程序测试有一个REG不能读出正确值(以前也一样)。
【424楼】&nbsp;dack&nbsp;:试着读一下测试程序吧。用IDA5反汇编一下

出0入0汤圆

发表于 2008-11-5 17:27:39 | 显示全部楼层
下午反汇编了一下,就是那个测试读ia0-5(mac地址)的程序,地址基本搞清楚了,明天修改一下u-boot,看看成不成。

出0入0汤圆

发表于 2008-11-6 16:39:55 | 显示全部楼层
听说价格上去了,如果能回到140就搞

出0入0汤圆

发表于 2008-11-6 16:57:00 | 显示全部楼层
把u-boot带的91c96驱动改了一下,可以读到eeprom里存的mac地址了,但是ping不通。不知道哪里有问题,也不知道是不是和91c96本身就不兼容。怎么就是找不到91c93的datasheet呢。真是奇怪

出0入0汤圆

发表于 2008-11-7 15:57:14 | 显示全部楼层
new.ease&nbsp;是不是已经知道了很多模块的读写或控制方法了?&nbsp;(&nbsp;测试界面都搞出来了。)

能不能给出控制LCD的方法或程序?&nbsp;&nbsp;我想把它改成简单示波器,需要这个。谢谢。

另外&nbsp;好像cpld没有加密,可以读出cpld的数据。但如何反推出逻辑呢?有没有人知道?

谢谢。

出0入0汤圆

发表于 2008-11-10 14:10:24 | 显示全部楼层
终于搞定了u-boot的网络,现在可以dhcp到ip,ping通电脑了,tftp什么的还没试,不过我想已经不是问题,上传修改好的源代码和bin文件。

二进制文件ourdev_492072.rar(文件大小:50K)&nbsp;(原文件名:u-boot.rar)&nbsp;
源文件ourdev_492073.rar(文件大小:7.50M)&nbsp;(原文件名:u-boot-1.3.4.rar)&nbsp;
主要修改是u-boot自带的91c96驱动,把其中16bit读写改成8bit读写,修改过程中走了很多弯路,不过也是值得的,如果一次就成功,我想我不会有动力去看91c96的datasheet,还有下次要注意的是,宏定义一定要仔细,注意不要少加了括号,尤其是形参,因为实参传进来的时候如果是a|b等形式的话,很容易出错。

u-boot似乎gdb命令不能用,只有powerpc上才有这个功能,不管了。

下一步准备移植redboot,个人感觉redboot功能要比u-boot强大。

本贴被 dack 编辑过,最后修改时间:2008-11-10,14:22:34.

出0入0汤圆

发表于 2008-11-10 14:58:08 | 显示全部楼层
顶了!

出0入0汤圆

 楼主| 发表于 2008-11-10 17:55:17 | 显示全部楼层
忍,不住上来.顶了.

dack.&nbsp;&nbsp;&nbsp;GOOD&nbsp;GOOD

出0入0汤圆

发表于 2008-11-10 19:38:00 | 显示全部楼层
好呀
真是好东西,

出0入0汤圆

发表于 2008-11-11 16:54:15 | 显示全部楼层
new.ease&nbsp;:问个问题
我编译的redboot&nbsp;ROM版烧到flash里可以运行,改成RAM版用上面的ROM版load到ram里不能运行,每按一下键会出一串数据,你load到ram里的什么地方呢,有没有限制,在哪里设的?

出0入0汤圆

发表于 2008-11-12 16:37:11 | 显示全部楼层
redboot的配置比uboot复杂多了,我怀疑有没有人能把那么多的配置全部搞清楚。现在有点眉目了,常用的命令都有了,网络也能ping通了,telnet也能登录上去了。但是网卡驱动似乎还有点问题,传送大量数据会死掉,例如发一个help命令就会死掉,而发送fis&nbsp;list就不会,x命令加-l&nbsp;0x40不会死,加-l&nbsp;0x10000就会死。奇怪。还要查查看。

出0入0汤圆

发表于 2008-11-13 10:46:50 | 显示全部楼层
搞定了,上传二进制文件和源码,因为源码太大,所以上传diff文件,原版请到下面链接下载
http://download2.ecoscentric.com/snapshots/configtool-081009.bz2&nbsp;&nbsp;&nbsp;&nbsp;配置工具,下载解压后加上运行属性即可运行
http://download2.ecoscentric.com/snapshots/ecos-trunk-full-081109.tar.bz2&nbsp;&nbsp;&nbsp;&nbsp;ecos源码

点击此处下载&nbsp;ourdev_496256.rar(文件大小:154K)&nbsp;(原文件名:redboot.rar)&nbsp;
其中三个文件,sda01.ecc是配置文件,用上述配置工具打开,可以修改配置,重新编译。
diff文件应该可以用patch命令补丁到源码上,我没用过,我是用&nbsp;diff&nbsp;-Ncr&nbsp;ecos&nbsp;ecos-b>ecos.diff命令产生的diff文件,其中有些文件是编译产生的,我用了clean命令以后还在那里,还有一些文件(flash.c和main.c)修改&nbsp;是因为编译出错,和工具链版本有关系。如果你的工具链编译不出错,可以不修改这两个文件。

重新做了一下diff文件,把一些不相关的文件删掉了,例如CVS文件。
点击此处下载&nbsp;ourdev_496457.rar(文件大小:58K)&nbsp;(原文件名:ecos.rar)&nbsp;
下载了ecos源文件后解压,进入ecos目录,然后输入&nbsp;patch&nbsp;-p1&nbsp;&lt;&nbsp;../ecos.diff&nbsp;就得到我修改好的版本了。


本贴被 dack 编辑过,最后修改时间:2008-11-13,13:03:29.

出0入0汤圆

发表于 2008-11-13 10:54:23 | 显示全部楼层
呵呵,看不明白

出0入0汤圆

发表于 2008-11-13 19:03:36 | 显示全部楼层
也不明白

出0入0汤圆

发表于 2008-11-14 07:52:43 | 显示全部楼层
这是要焊上htag后连上电脑后再刷的吧,我的还没有焊

出0入0汤圆

发表于 2008-11-14 16:46:02 | 显示全部楼层
上次上传的redboot有个bug,fconfig配置ip地址时会出错,今天查了一天,算是解决了。但为什么会这样还是没搞清楚,fconfig.c里有一段代码是这样的
&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;CONFIG_IP:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&hold_ip_val.s_addr,&nbsp;&((in_addr_t&nbsp;*)val_ptr)->s_addr,&nbsp;sizeof(in_addr_t));
就是这个memcpy出错,里面源地址&((in_addr_t&nbsp;*)val_ptr)->s_addr有问题,我把这个值print出来,然后替换掉&((in_addr_t&nbsp;*)val_ptr)->s_addr后没有问题,因为in_addr_t这个结构中只有s_addr一个成员,所以事实上val_ptr等于上面的那一串地址,我用val_ptr替换掉上面那一串地址,结果正确,真是个奇怪的问题。有空要反汇编出来研究一下
上传新的bin文件
点击此处下载&nbsp;ourdev_499174.rar(文件大小:56K)&nbsp;(原文件名:redboot.rar)&nbsp;

出0入0汤圆

发表于 2008-11-17 09:25:48 | 显示全部楼层
上面的问题我想应该是结构的对齐引起的,这个结构没对齐,造成编译器判断出错,可能换个版本的编译器就好了。我的解决办法应该没问题,先不管了。

下一步就是裸机驱动硬件,先把要驱动的东西列一下:
网卡(已经ok)、lcd、触摸屏、按键、led(已经ok)、ps2键盘、ps2鼠标、声卡、usb&nbsp;host、usb&nbsp;slave、cf卡,SD(mmc)卡、IrDA&nbsp;。
我漏了什么吗?

有些驱动可以等linux内核搞好了再做。

先从简单的开始,lcd和触摸屏。开工。

出0入0汤圆

发表于 2008-11-17 13:55:56 | 显示全部楼层
顶!

出0入0汤圆

发表于 2008-11-17 15:57:21 | 显示全部楼层
顶!

出0入0汤圆

发表于 2008-11-17 17:05:20 | 显示全部楼层
lcd可以点亮了,现在是用redboot直接向寄存器和ram里填写数据点亮的,稍后我会把redboot自带的那个测试lcd的程序修改一下放上来。

出0入0汤圆

发表于 2008-11-17 18:29:49 | 显示全部楼层
dack&nbsp;厉害。等你的程序。跟你学习。&nbsp;

出0入0汤圆

发表于 2008-11-18 07:50:06 | 显示全部楼层
想知道硬件上是怎么安装的,或者说是怎么连接的,上图呀,谢谢。我也想从头做起。本人不是这个专业的,想学习学习

出0入0汤圆

发表于 2008-11-19 16:54:56 | 显示全部楼层
回楼上:往上翻,有连接的照片。

这两天搞这个lcd显示程序出了很多问题。
先是编译好了用redboot&nbsp;load不进去,显示0x8000多的地址冲突,一查编译器缺省的链接地址是0x8000,而这个ram&nbsp;redboot占用了,没办法,想法改基地址,好不容易用链接脚本改了,结果还是不能运行。
后来无意看到裸机程序应该加-nostdlib参数编译,结果编译错误,有几个地方的运算使用了库函数,删掉。编译通过。心想redboot有debug功能,先debug一下吧。
结果函数一返回就跑飞,奇怪。怎么搞都不行,只好汇编级调试,现象更加奇怪,bl指令执行完,lr寄存器的内容竟然不是返回地址。
后来死马当活马医,干脆不调试了,直接load进去run,先是用go&nbsp;-w&nbsp;50命令运行,想着可以退回redboot,结果lcd不亮,后来又直接用go命令运行,竟然正常了。奇怪。
估计这两个问题都是一个原因引起的,我还要再查查。

出0入0汤圆

发表于 2008-11-20 09:16:08 | 显示全部楼层
bl指令执行完,lr寄存器的内容不对的问题,确定是gdb有问题,一个程序,在linux下用arm-unknown-linux-gdb&nbsp;6.8调试就会出问题,而在windows下用winarm的arm-eabi-gdb&nbsp;6.8就没有问题。真是怪事。

出0入0汤圆

发表于 2008-11-20 11:06:17 | 显示全部楼层
我又下载了一个编译好的gdb&nbsp;6.6还是一样的问题,到底是gdb的问题还是linux的问题呢,谁有确定可用的linux下的gdb放上来一个我试试。谢谢

出0入0汤圆

发表于 2008-11-20 14:54:59 | 显示全部楼层
搞定了,原来是abi的问题,加上set&nbsp;arm&nbsp;abi&nbsp;AAPCS后,正常了。

上传lcd测试程序(源文件和elf文件),只是简单测试,显示图片,文本。因为printf里用到一些库函数的地方被我删掉了,所以行号显示不正确。
点击此处下载&nbsp;ourdev_505374.rar(文件大小:74K)&nbsp;(原文件名:hello.rar)&nbsp;

用redboot&nbsp;load&nbsp;进去,go,就行了

出0入0汤圆

发表于 2008-11-20 15:39:51 | 显示全部楼层
顶呀,现在就剩dack大侠了,

出0入0汤圆

发表于 2008-11-20 15:42:29 | 显示全部楼层
关于硬件连接的问题,我看了上面的了,但是我想用idc20的插座直接焊在上面,后盖能不能盖上,我是生手,希望用插座,然后再把线连接出来的。

出0入0汤圆

发表于 2008-11-20 16:01:21 | 显示全部楼层
没办法,那里用插座恐怕不行,我是焊了8条线在那里,线的这头焊了一个10pin的插座,然后去掉机子左侧的白色挡板,那里正好有一个缺口,我把插座用热熔胶粘在缺口处的板子上,这样的话,盖上挡板不影响外观,去掉挡板就可以调试。外面用一块万能版转接到并口和串口。

出0入0汤圆

发表于 2008-11-20 20:27:12 | 显示全部楼层
好的,谢谢了,我也试试

出0入0汤圆

发表于 2008-11-21 12:41:12 | 显示全部楼层
顶呀,现在就剩dack大侠了。

出0入0汤圆

发表于 2008-11-21 13:25:27 | 显示全部楼层
强贴留名

出0入0汤圆

发表于 2008-11-21 13:26:43 | 显示全部楼层
大侠可不敢当,不是客气,我是个新手,而且是个很新的新手,在搞这个之前,对arm的了解只是听说过有这么一种东西,对linux的了解只是装上试过,知道ls等于dir,其他的不懂。英文就更烂,小学水平吧,前一段时间测词汇量在600左右。这一阵子学arm,网上看英文资料真的是头疼。

出0入0汤圆

发表于 2008-11-22 23:14:15 | 显示全部楼层
这几天,我天天都在关注,但是我买的就无法下手.

dack&nbsp;能留一下你的QQ吗?

到时候向你请教一下开发环境的建立

我看到你在上面的发言后.于是也买了一块,而且是中基电脑最后一块,显示还是坏的.我拿回来修了一下.大概是因为触摸的问题,所以形成了重影.

DACK
现在我就是想把这个开发环境先建立起来.

能留一下你的QQ吗?

我的232625803

出0入0汤圆

发表于 2008-11-24 07:52:26 | 显示全部楼层
继续顶

出0入0汤圆

发表于 2008-11-26 10:44:55 | 显示全部楼层
更新一下
&nbsp;&nbsp;&nbsp;&nbsp;*SA1110_LCCR1&nbsp;=&nbsp;0x01081270;
&nbsp;&nbsp;&nbsp;&nbsp;*SA1110_LCCR2&nbsp;=&nbsp;0x070700f3;
&nbsp;&nbsp;&nbsp;&nbsp;*SA1110_LCCR3&nbsp;=&nbsp;0x11;
&nbsp;&nbsp;&nbsp;&nbsp;fp->palette[0]&nbsp;=&nbsp;0x2000;&nbsp;&nbsp;//&nbsp;Tell&nbsp;controller&nbsp;12&nbsp;bits
//&nbsp;&nbsp;&nbsp;&nbsp;*SA1110_LCCR0&nbsp;=&nbsp;0xBB;&nbsp;&nbsp;//&nbsp;B&W
&nbsp;&nbsp;&nbsp;&nbsp;*SA1110_LCCR0&nbsp;=&nbsp;0x3d;&nbsp;&nbsp;//&nbsp;Color
&nbsp;&nbsp;&nbsp;&nbsp;sda01_BCR(0x8c00,0x8c00);
修改上面两句,可以基本去除屏幕闪烁,试出来的。

出0入0汤圆

发表于 2008-11-26 10:58:54 | 显示全部楼层
支持

出0入0汤圆

发表于 2008-12-3 13:32:31 | 显示全部楼层
redboot更新一下

sda01目录里hal_platform_setup.h文件修改下面几句
dram_table:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.word&nbsp;&nbsp;&nbsp;SA11X0_DRAM0_CAS_0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xAAAAAA7F
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.word&nbsp;&nbsp;&nbsp;SA11X0_DRAM0_CAS_1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xAAAAAAAA
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.word&nbsp;&nbsp;&nbsp;SA11X0_DRAM0_CAS_2,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xAAAAAAAA
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.word&nbsp;&nbsp;&nbsp;SA11X0_EXP_BUS_CONFIGURATION,&nbsp;0x994A994A
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.word&nbsp;&nbsp;&nbsp;SA11X0_REFRESH_CONFIGURATION,&nbsp;0x00740327
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.word&nbsp;&nbsp;&nbsp;SA11X0_DRAM2_CAS_0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xAAAAAA9F
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.word&nbsp;&nbsp;&nbsp;SA11X0_DRAM2_CAS_1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xAAAAAAAA
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.word&nbsp;&nbsp;&nbsp;SA11X0_DRAM2_CAS_2,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xAAAAAAAA
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.word&nbsp;&nbsp;&nbsp;SA11X0_SMROM_CONFIGURATION,&nbsp;&nbsp;&nbsp;0xA040A040
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.word&nbsp;&nbsp;&nbsp;SA11X0_DRAM_CONFIGURATION,&nbsp;&nbsp;&nbsp;&nbsp;0x72547254&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Disabled

有个参数错误,造成解压linux内核时crc校验出错。

lcd驱动起来后,想偷懒一下,因为很多驱动linux里已经包含了,不想再改成裸机代码了,所以想先搞个内核,跑起来后直接搞linux驱动。这几天一直在搞内核。现在最小内核(硬件驱动只有最基本的)已经可以跑起来了。然后就是慢慢往上加东西了。

出0入0汤圆

发表于 2008-12-3 16:32:06 | 显示全部楼层

出0入0汤圆

发表于 2008-12-5 11:56:05 | 显示全部楼层
linux跑是跑起来了,不过很多莫名其妙的问题,我用的busybox,所有的命令加上--help参数都会出Segmentation&nbsp;fault错误。PS1提示符里面的\u&nbsp;\t等等转义符全部不起作用。su会提示must&nbsp;be&nbsp;suid&nbsp;to&nbsp;work&nbsp;properly等等。

最近公司有新项目要做,估计没啥时间搞这个了。

出0入0汤圆

 楼主| 发表于 2008-12-5 19:12:43 | 显示全部楼层
最近偶也没空搞.不过搞也达不到兄弟的水平.
要是兄弟方面,放个教程或源程序.应该会有兄弟接下担子.

出0入0汤圆

发表于 2008-12-5 20:44:19 | 显示全部楼层
真是遗憾呀

出0入0汤圆

发表于 2008-12-5 21:18:48 | 显示全部楼层
new.ease&nbsp;我是很佩服的,要不是你改写的jflash,以及redboot,现在我恐怕还在瞎摸索呢。我做得这点都是站在new.ease的肩膀上完成的。呵呵
前面bootloader的源码我都上传了,后面linux部分刚开头,完全是瞎蒙,我自己也搞不清楚,没办法写教程。

不过我也不是不搞了,只是这段时间主要还是要做公司的项目,进度肯定很慢了。

出0入0汤圆

发表于 2008-12-6 07:49:58 | 显示全部楼层
我的终于死机了
在用usb拷贝东西时强行拔掉了,然后重启,就死了

出0入0汤圆

发表于 2008-12-8 16:13:14 | 显示全部楼层
Segmentation&nbsp;fault错误&nbsp;搞定了,原因是busybox有错误,起因是一个人报告powerpc上大头系统有这个问题,busybox修改后造成我们这个小头系统出问题。
修改applets/usage_compressed文件
改成这样
#&nbsp;Extra&nbsp;effort&nbsp;to&nbsp;avoid&nbsp;using&nbsp;"od&nbsp;-t&nbsp;x1":&nbsp;-t&nbsp;is&nbsp;not&nbsp;available
#&nbsp;in&nbsp;non-CONFIG_DESKTOPed&nbsp;busybox&nbsp;od

"$loc/usage"&nbsp;|&nbsp;bzip2&nbsp;-1&nbsp;|&nbsp;od&nbsp;-v&nbsp;-x&nbsp;\
|&nbsp;$SED&nbsp;-e&nbsp;'s/^[^&nbsp;]*//'&nbsp;\
|&nbsp;$SED&nbsp;-e&nbsp;'s/&nbsp;//g'&nbsp;\
|&nbsp;grep&nbsp;-v&nbsp;'^$'&nbsp;\
|&nbsp;$SED&nbsp;-e&nbsp;'s/\(..\)\(..\)/0x\2,0x\1,/g'

原来报告错误的网址:https://busybox.net/bugs/view.php?id=4494

出0入0汤圆

发表于 2008-12-8 16:48:49 | 显示全部楼层
su会提示must&nbsp;be&nbsp;suid&nbsp;to&nbsp;work&nbsp;properly也算是解决了,给busybox加上s属性后正常了,但是我觉得这不是个正确的方法,因为pc上的linux里的busybox没加s属性也可以正常运行。还要再查一下。

redboot执行linux的命令&nbsp;exec&nbsp;-c&nbsp;"root=31:1&nbsp;rootfstype=jffs2&nbsp;console=ttySA0,115200"
忘性太大,在这里记一下。上面的31是指mtdblock设备,1是指第二个mtdblock块,jffs2是我的根文件系统类型,串口控制台

出0入0汤圆

发表于 2008-12-9 13:48:17 | 显示全部楼层
提示符的问题也搞定了,原因是配置busybox时我少配置了一个选项。
现在根文件系统基本没啥问题了,要慢慢往linux里加东西了。
busybox我主要配置了第一个大项,其他基本都是缺省的,就是什么命令都包含了,虽然我只会用其中几个。呵呵。等linux搞得差不多了,再来精简这个。省得万一要用到,还要重搞根文件系统。

出0入0汤圆

发表于 2008-12-9 14:32:44 | 显示全部楼层
真是好消息呀,我就等着应用更多的软件的,自带的软件用处不大,word太慢了

出0入0汤圆

发表于 2008-12-9 15:10:17 | 显示全部楼层
to&nbsp;twentyjade&nbsp;:那你有的等了,你不如自己搞个winarm,编译一些你想用的软件,在现在的平台上跑跑。我是在玩怎么搞平台,到最后编译应用软件还早着那。

出0入0汤圆

 楼主| 发表于 2008-12-9 18:12:58 | 显示全部楼层
TO【473楼】&nbsp;dack&nbsp;
你用的是那个版本的内核呢??在那可以下载.有空也来跟进一下.

出0入0汤圆

发表于 2008-12-10 07:42:20 | 显示全部楼层
?不懂呀,winarm?什么东东?我最近也很忙,等等我会着手试一试,另外,我拆了看到电路上好像有个地方是可以焊纽扣电池的,怎么查正负极呢?我不想一重启动就要改时间什么的,丢失很多东西。在板子上的中间靠右,很大的一个圆

出0入0汤圆

发表于 2008-12-10 08:20:52 | 显示全部楼层
to:new.ease&nbsp;最新版2.6.27版,www.kernel.org下的。
to:twentyjade&nbsp;winarm就是windows下的arm编译器,和winavr类似。那个大圆还真没注意,可能是纽扣电池,旁边的字上写的什么?正负极好查,万用表量一下就行了,先找到地线,板子上大片的就是,然后量一下和哪边通,通的一般就是负极。

出0入0汤圆

发表于 2008-12-10 08:27:21 | 显示全部楼层
对了,建议大家把reset按键也引出来,非常有用,

出0入0汤圆

发表于 2008-12-10 11:40:00 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2008-12-11 14:16:04 | 显示全部楼层

出0入0汤圆

发表于 2008-12-11 14:48:51 | 显示全部楼层

出0入0汤圆

发表于 2008-12-11 15:06:51 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2008-12-11 17:16:27 | 显示全部楼层

出0入0汤圆

发表于 2008-12-11 18:50:25 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2008-12-11 19:53:24 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2008-12-11 21:26:21 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2008-12-11 21:44:55 | 显示全部楼层

出0入0汤圆

发表于 2008-12-11 21:50:11 | 显示全部楼层

出0入0汤圆

发表于 2008-12-11 21:53:22 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2008-12-11 22:17:17 | 显示全部楼层

出0入0汤圆

发表于 2008-12-12 12:29:43 | 显示全部楼层

出0入0汤圆

发表于 2008-12-12 17:28:30 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2008-12-14 18:02:11 | 显示全部楼层

出0入0汤圆

发表于 2008-12-14 19:44:03 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2008-12-14 21:41:54 | 显示全部楼层

出0入0汤圆

发表于 2008-12-18 18:09:39 | 显示全部楼层

出0入0汤圆

发表于 2008-12-19 07:58:18 | 显示全部楼层

出0入0汤圆

发表于 2008-12-19 14:13:35 | 显示全部楼层

出0入0汤圆

发表于 2008-12-19 16:01:36 | 显示全部楼层
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 04:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表