ハードも好きにいじろう。
とりあえずSL-C700を分解してみました。
ページ作成: ヤマケン Page created: YamaKen <yamaken at bp.iij4u.or.jp>
Use Excite_web_translation to translate this page into English. Sorry for inconvenience.
Processor Type: PXA250 Revision: B2 Temp: C (Commercial Temp) Processor Speed: 400
ここから各種資料をダウンロード可能
54ball FBGA 0.8mm ball pitch
HY: HYNIX 5: SDRAMs V: Vdd=3.3V 2: 128M 6: x16 C: C-Version (DIE GENERATION) L: LowPower F: FBGA -H: PC133,CL3
512Mbit (64M * 8bits)
NANDフラッシュのプログラミング情報
CISブロックの構成等
ATI 215W100AFA12 FA5155.1 023400 TAIWAN
1M * 16bit 143MHz SDRAM, 60ball VFBGA
EtronTech? EM636165VE-7 G380205RDP608.1
Low power audio codec with integrated headphone driver, 28pin QFN
4ch * 8bit ADC, 16pin QSOP
Processor Type: PXA255 Revision: A0 Temp: C (Commercial Temp) Processor Speed: 400
ここから各種資料をダウンロード可能
下記のように行うとDIAG MENUやService Menuを表示することができる。
元ネタはZaurus Forum http://externe.net/zaurus/forum の Hardware の P2ROM Contents, flashing and architecture? にあるがこのとおりにやらなくても表示できるかもしれない(英語が苦手なので手順がよくわからなかった)。
また、確認した機種はC750なので他の機種だと違うかもしれない。
1.電源をOFFにする
2.バッテリーとAC電源を取り外す
3.バッテリーは取り外したままで、DキーとPキーを押しながらAC電源をつなぐ
4.キーを離すとDIAG MENUが表示される。
危険:EXTRA MENUのZaurus TestのNAND Flash(Full)を実行すると、内蔵Flashに書かれている全てのデータが上書きされるので、Zaurusが今後使用できなくなります。
その他のNAND関係のコマンドを実行すると内蔵Flashにテスト用のデータを書き込む、あるいはFlash消去を行うかもしれないので実行しないでください。
1.電源をOFFにする
2.バッテリーとAC電源を取り外す
3.バッテリーは取り外したままで、DキーとMキーを押しながらAC電源をつなぐ
4.キーを離すとSERVICE MENUが表示される。
多種あるARM CPUの比較チャート
'V5TE'等と表記される各命令セットの解説
XScale等に実装されている16bit命令セットThumbの解説。他CPUとの比較等
ザウルス特有の処理を見るにはカーネル全体ではなくパッチを見ればOK。emacsのdiff-modeを使うと修正箇所に対応するソースにすぐ飛べて便利。
| 機種 | コード名 | USBD_SERIAL_PRODUCT ID | USBD_NET_PRODUCTID |
| SL-5000D | COLLIE | 0x8002 | 0x8003 |
| SL-5500 | COLLIE | 0x8002 | 0x8003 |
| SL-A300 | DISCOVERY | 0x8005 | 0x8005 |
| SL-B500 | POODLE | 0x8006 | 0x8006 |
| SL-5600 | POODLE | 0x8006 | 0x8006 |
| SL-C700 | CORGI | 0x8007 | 0x8007 |
| SL-C750 | SHEPHERD | 0x9031 | 0x9031 |
| SL-7500 | SHEPHERD | 0x9031 | 0x9031 |
| SL-C760 | HUSKY | 0x9031 | 0x9031 |
dep_bool 'Enable Fast Context Switch Extention' CONFIG_ARM_FCSE $CONFIG_CPU_32
+ * 04-Apr-2003 Sharp for ARM FCSE
+#ifdef CONFIG_ARM_FCSE +#define TASK_SIZE ((current->mm->context.cpu_pid > CPU_PID_SPECIAL) ? (CPU_PID_SIZE) : (0xc0000000UL)) +#else #define TASK_SIZE (0xc0000000UL) +#endif
/* The ARM doesn't have a mmu context */
+#ifdef CONFIG_ARM_FCSE
+typedef struct {
+ int cpu_pid;
+} mm_context_t;
+#else
typedef struct { } mm_context_t;
+#endif
static void __init
fixup_corgi(struct machine_desc *desc, struct param_struct *params,
char **cmdline, struct meminfo *mi)
{
#if defined(CONFIG_ARCH_PXA_SHEPHERD)
SET_BANK (0, 0xa0000000, 64*1024*1024);
#else
SET_BANK (0, 0xa0000000, 32*1024*1024);
#endif
#if defined(CONFIG_ARCH_PXA_SHEPHERD)
MACHINE_START(CORGI, "SHARP Shepherd")
#else
MACHINE_START(CORGI, "SHARP Corgi")
#endif
+ * 16-Jan-2003 SHARP sleep_on -> interruptible_sleep_on + * 13-Mar-2003 SHARP for PXA255
+#if defined(CONFIG_ARCH_PXA_SHEPHERD)
+ if ( cccr_reg == 0x161 ) {
+ cpu_xscale_sl_change_speed_161();
+ }
+ else if ( cccr_reg == 0x145 ) {
+ cpu_xscale_sl_change_speed_145();
+ } else {
+ cpu_xscale_change_speed_241();
+ }
+#else
signed long passcount;
int i = 0;
passcount = OSCR - OSMR0;
- if (passcount >= 0) {
+ if ((passcount >= 0) || ( ( idletick != 0) && (passcount < -(idletick+1) * LATCH)) ) {
// timer irq has occured
(*(unsigned long *)&jiffies)+=idletick;
if ((OSSR & OSSR_M0) == 0) {
- while ((unsigned long)(OSMR0 - OSCR) < 0) {
+ while (((signed long)(OSMR0 - OSCR)) < 0) {
+#if defined(CONFIG_ARCH_PXA_SHEPHERD) + sharpsl_restart_nonstop(); +#else sharpsl_restart(); +#endif
- sleep_on(&fl_key); + interruptiblee_sleep_on(&fl_key);
#if defined(CONFIG_ARCH_PXA_POODLE) || defined(CONFIG_ARCH_PXA_CORGI) +#if defined(CONFIG_ARCH_PXA_SHEPHERD) + sharpsl_chg_freq = (unsigned int)0x00000161; + cpu_xscale_sl_change_speed_161(); +#else #if 1 // default 400MHz sharpsl_chg_freq = (unsigned int)0x00000241; #else cpu_xscale_sl_change_speed_145_without_lcd(); +#endif #endif
+ * 16-Jan-2003 SHARP sleep_on -> interruptible_sleep_on + * 09-Apr-2003 SHARP for Shaphard (software reset)
+#if defined(CONFIG_ARCH_PXA_SHEPHERD) + case 0x161: + if ( CCCR == 0x0161 ) break; + cpu_xscale_sl_change_speed_161(); + cccr_reg = CCCR; + break; +#endif
+#if defined(CONFIG_ARCH_PXA_SHEPHERD)
+ else if ( sharpsl_chg_freq == 0x0161 ) {
+ cpu_xscale_sl_change_speed_161();
+ }
+#endif
+ * 14-Mar-2003 Sharp for PXA255
+#if defined(CONFIG_ARCH_PXA_SHEPHERD)
+
+ENTRY(cpu_xscale_sl_change_speed_161)
+ stmfd sp!, {r0, r1, r2, r3, r4, lr}
+
+ ldr r0, CMR_BASE
+ ldr r1, =0x161
+ str r1, [r0, #CMR_CCCR]
+
+ ldr r0, MD_BASE
+ ldr r2, [r0, #MD_MDREFR]
+
+ bl CodeOnCache_161
+
+ .align 5
+ .text
+CodeOnCache_161:
+ mov r1, #0x2
+ mcr p14, 0, r1, c6, c0, 0
+ str r2, [r0, #MD_MDREFR]
+ ldr r2, [r0, #MD_MDREFR]
+
+ ldmfd sp!, {r0, r1, r2, r3, r4, pc}
+
+ .align 5
+ .text
+
+#endif
+ * 16-Jan-2003 SHARP enable non-cached bufferable page + * 20-Mar-2003 SHARP supported PXA255 + * 04-Apr-2003 Sharp for ARM FCSE
+#ifdef CONFIG_ARM_FCSE + .align 5 +ENTRY(cpu_xscale_set_pgd_without_invalidation) + mcr p15, 0, r0, c2, c0, 0 @ load page table pointer + cpwait_ret lr, ip + + .align 5 +ENTRY(cpu_write_pid_register) + mov r0, r0, lsl #25 + mcr p15, 0, r0, c13, c0, 0 + cpwait_ret lr, ip +#endif
#if CACHE_WRITE_THROUGH - bic r2, r2, #L_PTE_BUFFERABLE + tst r1, #L_PTE_CACHEABLE + bicne r2, r2, #L_PTE_BUFFERABLE @ clear B only if C is set #else
.type cpu_arch_name, #object cpu_arch_name: - .asciz "armv5" + .asciz "armv5te" .size cpu_arch_name, . - cpu_arch_name
static int rtc_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg)
{
...
case RTC_ALM_SET:
+#ifdef CONFIG_ARCH_SHARP_SL
+ {
+ struct rtc_time rtc_tm;
+ unsigned char mon, day, hrs, min, sec;
+ unsigned int yrs;
+
+ if (copy_from_user(&rtc_tm, (struct rtc_time*)arg,
+ sizeof(struct rtc_time)))
+ return -EFAULT;
+
+ yrs = rtc_tm.tm_year + 1900;
+ mon = rtc_tm.tm_mon + 1; /* tm_mon starts at zero */
+ day = rtc_tm.tm_mday;
+ hrs = rtc_tm.tm_hour;
+ min = rtc_tm.tm_min;
+ sec = rtc_tm.tm_sec;
+
+ if ((yrs < 1970) || (yrs > 2037))
+ return -EINVAL;
+ if ((mon > 12) || (day == 0))
+ return -EINVAL;
+ if (day > (days_in_mo[mon-1] + ((mon == 2) && is_leap(yrs))))
+ return -EINVAL;
+ if ((hrs >= 24) || (min >= 60) || (sec >= 60))
+ return -EINVAL;
+
+ RTAR = mktime(yrs, mon, day, hrs, min, sec);
+
+ return 0;
+ }
+#else
if (copy_from_user (&tm2, (struct rtc_time*)arg, sizeof (tm2)))
return -EFAULT;
decodetime (RCNR, &tm);
if ((unsigned)tm2.tm_hour < 24)
tm.tm_hour = tm2.tm_hour;
if ((unsigned)tm2.tm_min < 60)
tm.tm_min = tm2.tm_min;
if ((unsigned)tm2.tm_sec < 60)
tm.tm_sec = tm2.tm_sec;
RTAR = mktime ( tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
tm.tm_hour, tm.tm_min, tm.tm_sec);
return 0;
#endif
+ * 01-Apr-2003 Sharp for SL-C750
+#ifdef CONFIG_ARCH_PXA_SHEPHERD
+static duty_vr_t corgibl_duty_table[CORGI_LIGHT_SETTING] = {
+ {0x00, 0}, // 0% Light Off
+ {0x01, 0}, // 20% Dim 1
+ {0x05, 0}, // 40% 2
+ {0x0b, 0}, // 70% 3
+ {0x05, 1}, // 40% 4
+ {0x0b, 1}, // 70% 5
+ {0x1f, 1} // 100% 6
+};
+#else
static duty_vr_t corgibl_duty_table[CORGI_LIGHT_SETTING] = {
{0x00, 0}, // 0% Light Off
{0x01, 0}, // 20% Dim
{0x02, 0}, // 25% 1
{0x0b, 0}, // 70% 2
{0x05, 1}, // 40% 3
{0x0b, 1}, // 70% 4
{0x1f, 1} // 100% 5
};
+#endif
+ * 28-02-2003 SHARP supported VRAM image cache for ver.1.3 + * 19-03-2003 SHARP disabled VRAM image cache for ver.1.3 + * 16-04-2003 SHARP for Shepherd
+//#define _IMAGE_CACHE_SUPPORT // for image cache on video memory
+#ifdef _IMAGE_CACHE_SUPPORT +#define REMAPPED_FB_LEN 0x200000 +#else //_IMAGE_CACHE_SUPPORT #define REMAPPED_FB_LEN 0x15ffff +#endif //_IMAGE_CACHE_SUPPORT
+#define W100FB_CONFIG_EX 0x57415202 /* WAL\02 */
+#ifdef _IMAGE_CACHE_SUPPORT // for image cache on video memory + +#define IMG_CACHE_MALLOC_SIZE 0x1000 +#define IMG_CACHE_OFFSET_VGA (0x97008) +#define IMG_CACHE_TOTAL_SIZE_VGA (0x200000-0x4000-IMG_CACHE_OFFSET_VGA) +#define IMG_CACHE_SKIP_MARK (0xffffffff) + +static u32 *save_img_cache_ptr=NULL; +static u32 save_img_alloc_num=0; +#define __PRINTK(arg...) //printk(arg) +#undef __SUM //for debug + +static u32* save_image_cache(u32 *alloc_num); +static int restore_image_cache(u32 *img_src,u32 alloc_num); +static int cleanup_image_cache(u32 *img_src,u32 alloc_num); + +// defalut don't skip +static int start_skip_save_image_no = (-1); +static int end_skip_save_image_no = (-1); +#endif //_IMAGE_CACHE_SUPPORT
+#ifdef CONFIG_ARCH_PXA_HUSKY + c->blocks = consistent_alloc(GFP_KERNEL, + sizeof(struct jffs2_eraseblock) * c->nr_blocks, + &c->blocks_phys); +#else c->blocks = kmalloc(sizeof(struct jffs2_eraseblock) * c->nr_blocks, GFP_KERNEL); +#endif
+#ifdef CONFIG_ARCH_PXA_HUSKY + consistent_free( c->blocks, + sizeof(struct jffs2_eraseblock) * c->nr_blocks, + c->blocks_phys ); +#else kfree(c->blocks); +#endif
+ * 05-Dec-2002 SHARP adjust REVERVED_BLOCKS values for storage-full + * 21-May-2003 SHARP modified JFFS2_RESERVED_BLOCKS_BAD
+#ifdef CONFIG_ARCH_PXA_HUSKY +#define JFFS2_RESERVED_BLOCKS_BAD 80 +#else #define JFFS2_RESERVED_BLOCKS_BAD 24 +#endif
レジスタ設定を読み書きするカーネルモジュールが提供されている。
insmod /lib/modules/2.4.18-rmk7-pxa3-embedix/kernel/arch/arm/mach-pxa/registers.o cd /proc/cpu/registers ls cat HOGE
SDRAMとCPUの接続は32bit 100MHz(正確には99.53MHz) CL3。
cat CCCR 0x241 # Core Clock Configuration Register (CCCR) # L: 00001 Multiplier = 27 (Memory Frequency is 99.53MHz from 3.6864 MHz crystal) # M: 10 Multiplier = 2 (Run Mode Frequency is 2 times the Memory Frequency) # N: 100 Multiplier = 2 # Run Mode Frequency to Turbo Mode Frequency Multiplier Turbo # Mode Freq. = Run Mode Frequency * N
cat MDCNFG 0x01A81AA9 # SDRAM Configuration Register (MDCNFG) # DE0: 1 # DE1: 0 # DWID0: 0 # DCAC0[1:0]: 01 # DRAC0[1:0]: 01 # DNB0: 1 # DTC0[1:0]: 10 # tRP=3, CL=3, tRCD=3, tRAS=7, tRC=10 (単位: clk) # DADDR0: 0 # DLATCH0: 1 # DSA1111_0: 1 # Reserved: 000
行い方はSL-C700詳細解析を参照
CCCRレジスタはPXA255 Processor Developer's Manual(3-35)参照。
cat CCCR 0x161 # Core Clock Configuration Register (CCCR) # L(Bit4-0): 00001 Multiplier = 27 (Memory Frequency is 99.53MHz from 3.6864 MHz crystal) # M(Bit6-5): 11 Multiplier = 3 (run mode frequency is 4 times the memory frequency) # N(Bit9-7): 010 Multiplier = 1 # Run Mode Frequency to Turbo Mode Frequency Multiplier Turbo # Mode Freq. = Run Mode Frequency * N
MDCNFGレジスタはPXA255 Processor Developer's Manual(6-8)参照。
cat MDCNFG 0x01A81AC9 # SDRAM Configuration Register (MDCNFG) # DE0(Bit0): 1 SDRAM partition0 enabled # DE1(Bit1): 0 SDRAM partition1 disabled # DWID0(Bit2): 0 SDRAM data bus width for partition pair 0/1(32bit) # DCAC0[1:0](Bit4-3): 01 Number of Column Address bits for partition pair 0/1(9 column address bits) # DRAC0[1:0](Bit6-5): 10 SDRAM row address bit count for partition pair 0/1(13 row address bits) # DNB0(Bit7): 1 Number of banks in lower partition pair(4 internal SDRAM banks) # DTC0[1:0](Bit9-8): 10 Timing Category for SDRAM pair 0/1. # tRP=3, CL=3, tRCD=3, tRAS=7, tRC=10 (単位: clk) # DADDR0(Bit10): 0 reserved # DLATCH0(Bit11): 1 Return Data from SDRAM latching scheme for pair 0/1 # (Latch return data with return clock) # DSA1111_0(Bit12): 1 Use SA1111 Addressing Muxing Mode for pair 0/1. # Reserved(Bit15-13: 000
写真貼り付けや情報追加は勝手にやっちゃってください。関連する規格の資料なんかも集約したいですね。
に写っている水色のコードが落としたショックで切れました。(涙)これって何なんでしょう?カーネルアップデート関係は、専用のページ「Linuxザウルス開発メモ/独自ビルドカーネル」を作成しました。カーネルアップデート関係のこれ以降の投稿は、専用ページの方へお願いいたします。また、このページに投稿されたカーネルアップデート関係の発言は、専用ページにもコピーしました。
いやな想像をすると、IntelはPXA250型番ではバグを直さず*********つもり では? ************************するというのは有り得ると 思う。PDAの新機種が出るタイミングでバグを直して「新しいXScaleになったから速く なった」と****すれば**********。