<div dir="ltr">Hello Kim,<div><br></div><div>Kim, listen to me/read me now very carefully. Please. :-)</div><div><br></div><div>For the standard I2C interface, you have only two serial lines: I2C_CLK and I2C_DATA. Your C2000 is master, so it will ALWAYS provide I2C_CLK as OUT. With I2C_DATA things are a bit more complicated. It is IN/OUT line, and once you output on it, you MUST turn it around.</div><div><br></div><div>I'll provide to you an adequate example. Let us assume <span style="font-size:12.8px">SC_USE_SEL has two dedicated IO_14 as I2C_CLK, and IO_13 as I2C_DATA.</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">For the I2C_CLK, it is always output. For I2C_DATA, it is bidirectional.</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">So, when you supply slave I2C address on the bus, the following is true:</span></div><div><span style="color:rgb(80,0,80);font-size:12.8px">GPIO_SC_USE_SEL : 6000</span><br></div><div><span style="color:rgb(80,0,80);font-size:12.8px">GPIO_SC_IO_SEL  : 0 (all pins as OUT direction)</span><br style="color:rgb(80,0,80);font-size:12.8px"><span style="color:rgb(80,0,80);font-size:12.8px">GPIO_SC_GP_LVL  : bit banging on pins 13, 14</span><br></div><div><span style="color:rgb(80,0,80);font-size:12.8px"><br></span></div><div><font color="#500050"><span style="font-size:12.8px">Now, you need to turn around your data bus, to be IN. Here is the situation:</span></font></div><div><div><span style="color:rgb(80,0,80);font-size:12.8px">GPIO_SC_USE_SEL : 6000</span><br></div><div><span style="color:rgb(80,0,80);font-size:12.8px">GPIO_SC_IO_SEL  : 2000 (pin 13 is now defined as IN direction!)</span><br style="color:rgb(80,0,80);font-size:12.8px"><span style="color:rgb(80,0,80);font-size:12.8px">GPIO_SC_GP_LVL  : answer coming on pin 13, you have to sample it correctly in time READing this register (only bit 13 is valid) and looking into bit 13 value).</span><br></div></div><div><span style="color:rgb(80,0,80);font-size:12.8px"><br></span></div><div><span style="color:rgb(80,0,80);font-size:12.8px">You might try it. And I rest my case here, Kim!</span></div><div><span style="color:rgb(80,0,80);font-size:12.8px"><br></span></div><div><span style="color:rgb(80,0,80);font-size:12.8px">Zoran</span></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jul 20, 2016 at 6:52 AM, 김유석 <span dir="ltr"><<a href="mailto:poplinux0@gmail.com" target="_blank">poplinux0@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div bgcolor="#FFFFFF" text="#000000">
    <div>Dear Sir. <br>
      <br>
      I'm understand your worry.<br>
      <br>
      My phase is develop the raw level API for gpio control.<br>
      SW I2C is will use the raw level API. SW I2C is will
      implementation.<br>
      <br>
      I was set the SC_USE_SEL, and SC_IO_SEL. correctly.<br>
      <br>
      And I already check the some function.<br>
        1. outmode => is OK.<br>
            If i set the HIGH on 12, 13, 14. then i can saw the HIGH
      status using ocilloscope.<br>
            If i set the LOW on 12, 13, 14. then i can saw the LOW
      status using ocilloscope.<br>
        2. input mode => is OK.<br>
            If i assign the 3.3V to 12, 13, 14. then i can read the
      SC_GP_LVL(0x7000).<br>
            If i assign the 0V to 12, 13, 14. then i can read the
      SC_GP_LVL(0x00)<br>
      <br>
      But just one function is fail.<br>
      <br>
       step 1. set the output mode. => is success<br>
       step 2. set the level. => is success<br>
       step 3. read the current config of SC_GP_LVL => is fail.<br>
              if if write 0x7000 to SC_GP_LVL, I want to read the value
      0x7000 from SC_GP_LVL. But i can't<br>
      <br>
      Thank you. <br>
      <br>
      <br>
      <br>
      <br>
      2016-07-19 오후 9:12에 Zoran Stojsavljevic 이(가) 쓴 글:<br>
    </div><div><div class="h5">
    <blockquote type="cite">
      <div dir="ltr">Hey Kim,
        <div><br>
        </div>
        <div>You have forced me myself to read the manual (chapter 25,
          C2000 Data Sheet). I was really wondering... So I decided to
          spend some time and read it myself (anyway, I have some time,
          albeit I do some other stuff). ;-)</div>
        <div><br>
        </div>
        <div>There is description of two power domains there, which I/O
          are using in order to drive customer I/O wishes. Two of them
          are: Core Well and SUS Well. You are using Core Well GPIOs,
          namely they are described in Ch. 25.3.1:</div>
        <div>Choosing the native Signal Mode or Customer GPIO Mode.</div>
        <div><br>
        </div>
        <div><img src="cid:part1.292F363C.36CAC9DC@gmail.com" alt="Inline image 1" height="459" width="473"><br>
        </div>
        <div> </div>
        <div>Questions here: did you set properly register: SC_USE_SEL?
          Your bits 12/13/14 should be in this register 1s (x111 xxxx
          xxxx xxxx binary), and you need to set also properly SC_IO_SEL
          register (them to be outputs). I am now looking into your
          code, and it seems you did it correctly (three OUT values):</div>
        <div><span style="font-size:12.8px">   GPIO_SC_USE_SEL : 7000</span><br style="font-size:12.8px">
          <span style="font-size:12.8px">    GPIO_SC_IO_SEL  : 0</span><br style="font-size:12.8px">
          <span style="font-size:12.8px">    GPIO_SC_GP_LVL  : 0</span><br>
        </div>
        <div><span style="font-size:12.8px"><br>
          </span></div>
        <div><span style="font-size:12.8px">Then you output your OUT
            values. Hmmmmmm... Considering I2C, you inevitable should
            read some INPUT values?! Which pins these are? You should
            have from master (your C2000) to supply CLK and OUT, but you
            also need to read IN values... Don't you???</span></div>
        <div><span style="font-size:12.8px"><br>
          </span></div>
        <div><span style="font-size:12.8px">I do NOT see input from I2C
            slave device... Any thoughts (any ideas)?</span><br>
        </div>
        <div><span style="font-size:12.8px"><br>
          </span></div>
        <div><span style="font-size:12.8px">Zoran</span></div>
      </div>
      <div class="gmail_extra"><br>
        <div class="gmail_quote">On Mon, Jul 18, 2016 at 7:20 AM, 김유석 <span dir="ltr"><<a href="mailto:poplinux0@gmail.com" target="_blank">poplinux0@gmail.com</a>></span>
          wrote:<br>
          <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
            <div bgcolor="#FFFFFF" text="#000000">
              <div>Dear Sir.<br>
                <br>
                I was test with by your advise. But SC_GP_LVL is always
                read 0x00<br>
                <br>
                source code & result is see below.<br>
                <br>
                <table border="1" cellpadding="2" cellspacing="2" width="100%">
                  <tbody>
                    <tr>
                      <td valign="top">  u32 read_gpio_level(const
                        struct soc_gpio_map *gpio)<br>
                          {<br>
                        <br>
                            u16 gpiobase __attribute__((unused)) =
                        pci_read_config16(SOC_LPC_DEV, GBASE) &
                        ~0xf;<br>
                        <br>
                            printk(BIOS_DEBUG, "%s() : Start\n",
                        __FUNCTION__);<br>
                            printk(BIOS_DEBUG, "  GPIO_SC_USE_SEL :
                        0x%x\n", inl(gpiobase + GPIO_SC_USE_SEL));<br>
                            printk(BIOS_DEBUG, "  GPIO_SC_IO_SEL  :
                        0x%x\n", inl(gpiobase + GPIO_SC_IO_SEL));<br>
                            printk(BIOS_DEBUG, "  GPIO_SC_GP_LVL  :
                        0x%x\n", inl(gpiobase + GPIO_SC_GP_LVL));<br>
                            printk(BIOS_DEBUG, "%s() : End\n\n",
                        __FUNCTION__);<br>
                        <br>
                            return 0;<br>
                          }<br>
                        <br>
                          int set_gpio_level(const struct soc_gpio_map
                        *gpio,<br>
                                             const int num,<br>
                                             const int lvl)<br>
                          {<br>
                            u16 gpiobase __attribute__((unused)) =
                        pci_read_config16(SOC_LPC_DEV, GBASE) &
                        ~0xf;<br>
                            u32 GPIO = 0;<br>
                        <br>
                            GPIO = setBit(GPIO, num);<br>
                        <br>
                            printk(BIOS_DEBUG, "%s() : GPIO set value
                        0x%x\n", __FUNCTION__, GPIO);<br>
                            outl(GPIO, gpiobase + GPIO_SC_GP_LVL);<br>
                        <br>
                            return 0;<br>
                          }<br>
                        <br>
                        <br>
                          void early_mainboard_romstage_entry(void)<br>
                          {<br>
                            setup_soc_gpios(&gpio_map);<br>
                            set_gpio_level(&gpio_map, 12, 1);<br>
                            mdelay(500);<br>
                            read_gpio_level(&gpio_map);<br>
                        <br>
                            set_gpio_level(&gpio_map, 13, 1);<br>
                            mdelay(500);<br>
                            read_gpio_level(&gpio_map);<br>
                        <br>
                            set_gpio_level(&gpio_map, 14, 1);<br>
                            mdelay(500);<br>
                            read_gpio_level(&gpio_map);<br>
                          };<br>
                        <br>
                        <br>
==================================================================================<br>
                          coreboot-NexG-59a9b0a6 Mon Jul 18 05:09:30 UTC
                        2016 romstage starting...<br>
                          set_gpio_level() : GPIO set value 0x1000<br>
                          read_gpio_level() : Start<br>
                            GPIO_SC_USE_SEL : 7000<br>
                            GPIO_SC_IO_SEL  : 0<br>
                            GPIO_SC_GP_LVL  : 0<br>
                          read_gpio_level() : End<br>
                        <br>
                          set_gpio_level() : GPIO set value 0x2000<br>
                          read_gpio_level() : Start<br>
                            GPIO_SC_USE_SEL : 7000<br>
                            GPIO_SC_IO_SEL  : 0<br>
                            GPIO_SC_GP_LVL  : 0<br>
                          read_gpio_level() : End<br>
                        <br>
                          set_gpio_level() : GPIO set value 0x4000<br>
                          read_gpio_level() : Start<br>
                            GPIO_SC_USE_SEL : 7000<br>
                            GPIO_SC_IO_SEL  : 0<br>
                            GPIO_SC_GP_LVL  : 0<br>
                          read_gpio_level() : End<br>
                        <br>
                        <br>
                        <br>
                      </td>
                    </tr>
                  </tbody>
                </table>
                <br>
                 <br>
                And I was re-view the DS of C2000. <br>
                <br>
                But DS is said to me that SC_GP_LVL is WR register.<br>
                <br>
                <br>
                <br>
                Please help me.<br>
                <br>
                Thank you. <br>
                <br>
                <br>
                <br>
                <br>
                2016-07-13 오후 4:40에 Zoran Stojsavljevic 이(가) 쓴 글:<br>
              </div>
              <div>
                <div>
                  <blockquote type="cite">
                    <div dir="ltr">
                      <div><b style="font-size:12.8px"><u><font face="굴림체">> When write 0x7000 write to
                              SC_GP_LVL, Can read the 0x00 from
                              SC_GP_LVL. everytime.</font></u></b><br>
                      </div>
                      <div class="gmail_extra"><br>
                      </div>
                      <div class="gmail_extra">Please, try to do the
                        following exercise:</div>
                      <div class="gmail_extra"><br>
                      </div>
                      <div class="gmail_extra">[1] WR 0x1000 to <span style="font-size:12.8px"><font face="굴림체">SC_GP_LVL,
                            then RD the value out of it: what it is?</font></span></div>
                      <div class="gmail_extra">[2] WR 0x2000 to <span style="font-size:12.8px"><font face="굴림체">SC_GP_LVL,
                            then RD the value out of it: what it is?</font></span><span style="font-size:12.8px"><font face="굴림체"><br>
                          </font></span></div>
                      <div class="gmail_extra">[3] WR 0x4000 to <span style="font-size:12.8px"><font face="굴림체">SC_GP_LVL,
                            then RD the value out of it: what it is?</font></span></div>
                      <div class="gmail_extra"><span style="font-size:12.8px"><font face="굴림체"><br>
                          </font></span></div>
                      <div class="gmail_extra"><span style="font-size:12.8px"><font face="굴림체">If
                            you have all 0x0, most likely it does mean
                            that Rangeley's </font></span><span style="font-family:굴림체;font-size:12.8px">SC_GP_LVL
                          register isd WR ONLY (when you read it, all
                          0s).</span></div>
                      <div class="gmail_extra"><span style="font-family:굴림체;font-size:12.8px"><br>
                        </span></div>
                      <div class="gmail_extra"><span style="font-family:굴림체;font-size:12.8px">To
                          ver</span><span style="font-family:굴림체;font-size:12.8px">ify
                          this, you should fetch the following document:</span></div>
                      <div class="gmail_extra"><font face="굴림체"><span style="font-size:12.8px"><a href="http://www.intel.com/content/www/us/en/processors/atom/atom-c2000-microserver-datasheet.html" target="_blank">http://www.intel.com/content/www/us/en/processors/atom/atom-c2000-microserver-datasheet.html</a></span></font><br>
                      </div>
                      <div class="gmail_extra"><font face="굴림체"><span style="font-size:12.8px"><br>
                          </span></font></div>
                      <div class="gmail_extra"><font face="굴림체"><span style="font-size:12.8px">And read Chapter 25
                            - General Purpose I/O (GPIO).</span></font></div>
                      <div class="gmail_extra"><span style="font-family:굴림체;font-size:12.8px"><br>
                        </span></div>
                      <div class="gmail_extra"><span style="font-family:굴림체;font-size:12.8px">Best
                          Regards,</span></div>
                      <div class="gmail_extra"><span style="font-family:굴림체;font-size:12.8px">Zoran </span></div>
                      <div class="gmail_extra"><font face="굴림체"><span style="font-size:12.8px"><br>
                          </span></font>
                        <div class="gmail_quote">On Wed, Jul 13, 2016 at
                          6:39 AM, 김유석 <span dir="ltr"><<a href="mailto:poplinux0@gmail.com" target="_blank">poplinux0@gmail.com</a>></span>
                          wrote:<br>
                          <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
                            <div bgcolor="#FFFFFF" text="#000000">
                              <p><font face="굴림체">Dear Sir. <br>
                                </font></p>
                              <p><font face="굴림체"><br>
                                  I want to control the GPIO pin that
                                  pin number is 12, 13, 14</font></p>
                              <p><font face="굴림체"><br>
                                  DataSheet(P 1909) and coreboot source
code(src/southbridge/intel/fsp_rangeley/gpio.c, gpio.h) is said to me
                                  that "It is very easy"</font></p>
                              <p><font face="굴림체"><br>
                                </font></p>
                              <p><font face="굴림체">If i want to set the
                                  HIGH to 12, 13, 14</font></p>
                              <p><font face="굴림체">Just setup the some
                                  register, is see below.<br>
                                </font></p>
                              <p><font face="굴림체">  SC_USE_SEL =
                                  0x7000(b0111 0000 0000 0000)<br>
                                </font></p>
                              <p><font face="굴림체">    Is mean, the 12,
                                  13, 14 is config to GPIO mode.(enable
                                  GPIO)<br>
                                </font></p>
                              <p><font face="굴림체">  SC_IO_SEL =
                                  0x00(b0000 0000 0000 0000)<br>
                                </font></p>
                              <p><font face="굴림체">    Is mean, the 12,
                                  13, 14 is output mode<br>
                                </font></p>
                              <p><font face="굴림체">  SC_GP_LVL = 0x7000</font><font face="굴림체">(b0111 0000 0000 0000)</font></p>
                              <p><font face="굴림체">    Is mean, the 12,
                                  13, 14 is set to HIGH level(1)</font></p>
                              <p><font face="굴림체"><br>
                                </font></p>
                              <p><font face="굴림체">src/southbridge/intel/fsp_rangeley/gpio.h</font></p>
                              <p><font face="굴림체">  /* Core GPIO */<br>
                                    const struct soc_gpio soc_gpio_mode
                                  = {<br>
                                      .gpio12 = GPIO_MODE_GPIO, /* Board
                                  ID GPIO */<br>
                                      .gpio13 = GPIO_MODE_GPIO, /* Board
                                  ID GPIO */<br>
                                      .gpio14 = GPIO_MODE_GPIO, /* Board
                                  ID GPIO */<br>
                                    };</font></p>
                              <p><font face="굴림체">  const struct
                                  soc_gpio soc_gpio_direction = {<br>
                                      .gpio12 = GPIO_DIR_OUTPUT,<br>
                                      .gpio13 = GPIO_DIR_OUTPUT,<br>
                                      .gpio14 = GPIO_DIR_OUTPUT,<br>
                                    };<br>
                                </font></p>
                              <p><font face="굴림체">  const struct
                                  soc_gpio soc_gpio_level = {<br>
                                      .gpio12 = GPIO_LEVEL_HIGH,<br>
                                      .gpio13 = GPIO_LEVEL_HIGH,<br>
                                      .gpio14 = GPIO_LEVEL_HIGH,<br>
                                    };<br>
                                  <br>
                                </font></p>
                              <p><font face="굴림체"><br>
                                </font></p>
                              <p><font face="굴림체">Yes, It is perfectley
                                  running.</font></p>
                              <p><font face="굴림체">The 12, 13, 14 PIN is
                                  goto active-HIGH.(I was check this pin
                                  use by oscilloscope.)<br>
                                </font></p>
                              <p><font face="굴림체"><br>
                                </font></p>
                              <p><font face="굴림체">And I'm try to read
                                  the SC_GP_LVL register for check
                                  current status/config of gpio pins</font></p>
                              <p><font face="굴림체">I was <b>respected</b>
                                  the read value is <b>0x7000</b>,
                                  because i was writed the <b>0x7000</b>
                                  to SC_GP_LVL.</font></p>
                              <p><font face="굴림체"><br>
                                </font></p>
                              <p><font face="굴림체">But, every time readed
                                  the <b>0x00</b> from SC_GP_LVL
                                  register.</font></p>
                              <p><font face="굴림체"><br>
                                </font></p>
                              <p><u><font face="굴림체">When write 0x7000
                                    write to SC_USE_SEL, Can read the
                                    0x7000 from SC_USE_SEL.</font></u></p>
                              <p><u><font face="굴림체">When write 0x00
                                    write to SC_IO_SEL, Can read the
                                    0x00 from SC_IO_SEL.</font></u></p>
                              <p><font face="굴림체"><br>
                                </font></p>
                              <p><font face="굴림체">But,</font></p>
                              <p><br>
                                <b><u><font face="굴림체">When write 0x7000
                                      write to SC_GP_LVL, Can read the
                                      0x00 from SC_GP_LVL. everytime.</font></u></b></p>
                              <p><font face="굴림체"><br>
                                </font></p>
                              <p><font face="굴림체">I don't understand
                                  this sistuation.<br>
                                </font></p>
                              <p><font face="굴림체"><br>
                                </font></p>
                              <p><font face="굴림체">Please advise to me. <br>
                                </font></p>
                              <p><font face="굴림체"><br>
                                </font></p>
                              <p><font face="굴림체">Thank you. </font></p>
                              <p><font face="굴림체"><br>
                                </font></p>
                              <p><font face="굴림체"><br>
                                </font></p>
                              <p><font face="굴림체"><br>
                                </font></p>
                              <p><font face="굴림체"><br>
                                </font></p>
                            </div>
                            <br>
                            --<br>
                            coreboot mailing list: <a href="mailto:coreboot@coreboot.org" target="_blank">coreboot@coreboot.org</a><br>
                            <a href="https://www.coreboot.org/mailman/listinfo/coreboot" rel="noreferrer" target="_blank">https://www.coreboot.org/mailman/listinfo/coreboot</a><br>
                          </blockquote>
                        </div>
                        <br>
                      </div>
                    </div>
                  </blockquote>
                  <p><br>
                  </p>
                </div>
              </div>
            </div>
          </blockquote>
        </div>
        <br>
      </div>
    </blockquote>
    <p><br>
    </p>
  </div></div></div>

</blockquote></div><br></div>