2013年8月23日 星期五

繼續挖GPIO

在GPIO LED初步完成控制後,下一步找 reset 按鈕。

同樣在 board/st/pdk7105/swUpdate.c 中找到 reset 按鈕相關:
static int check_key_press(void)
{
        int count,cur_key,next_key,led;

        led=0x00;
        count=7;
        cur_key=STPIO_GET_PIN(PIO0_BASSADDRESS, 1);




和LED同樣的 #define PIO0_BASSADDRESS  0xFD020000 表示同樣是在 gpiochip0 範圍內,
第二個參數 1 表示用以下指令可以建立相關的資料夾:
# echo "1" > /sys/class/gpio/export

讀取按鈕狀態:
# cat /sys/class/gpio/gpio1/value

1表示沒按(off),0表示按下(On)
不過 /sys/class/gpio/gpio/power/wakeup 沒有任何數值,
表示不能用來從suspend to ram 或 standby 喚醒。

這麼快就解開任務,當然要繼續趁勝追擊,
找出紀錄要 u-boot 用來判斷要使用哪組 bootargs 和 bootcmd。

在前面那個非常大的board/st/pdk7105/swUpdate.c的8636行。

int setenv_start(int partition,unsigned char flag)
{
        /* factory mode */
        if (flag == EXT_EXT2_USB)
        {
 

被下面函式在8972行呼叫

int update_process(void)
{ ......
        flag = ReadSPIFlashDataByChar(IPTV_FLAG_ADDR);
  ........
        setenv_start(partition,flag);

定義同樣在同一個檔案
#define IPTV_FLAG_ADDR 0x90000

然後在下面檔案找到
https://github.com/zheharry/u-boot-sh4-1.3.1_stm23_0045/blob/4f75340902b89827dd232d468e90f8e97b99f083/common/cmd_spi.c
extern unsigned char ReadSPIFlashDataByChar(unsigned int AddressOfFlag)
{
    unsigned char  CharData;
    unsigned char  StartAddr[3];


    StartAddr[0]=(AddressOfFlag>>16)&0xff;
    StartAddr[1]=(AddressOfFlag>>8)&0xff;
    StartAddr[2]=AddressOfFlag&0xff;


    spi_read(StartAddr, 3, &CharData, 1);


    return CharData;
}
到這裡關鍵字 spi(Serial peripheral Interface) 已經出現。
之後更底層的在
extern ssize_t spi_read (


結論是儲存在SPI flash,
所以接著直接動眼找板子上的零件,
看到 winbond 25Q80BVSIG 1025
一開始以為是 winbond 25080BVSIG 1025,
結果只找到一條對岸的購買消息,
不是只有我會看錯吧。

改正之後找到 spec 寫:
Product Number:W25Q80BVSSIG    package type:soic-8 8Mbit

可惜我目前編的Kernel沒有選下面網頁指出的項目:
Device Drivers
 Memory Technology Device (MTD) support
   Self-contained MTD device drivers --->
      <*> Support most SPI Flash chips (AT26DF, M25P, W25X, ...)
不然就可以馬上透過 MTD 來看看數值。

接下來的等這週末重編完kernel再繼續。

沒有留言:

張貼留言