electrodyssey.net

Odyssey of Electronics and Computers

NASR-M board bring-up, LMK03328 clock Zephyr OS driver

March 14, 2026 — Nazim

The LMK03328 clock driver is finally functional. Today, I was happily observing a sine-like signal at 33.33 MHz on the screen of my good old scope. I suppose it’s really a meander. Once I get a faster oscilloscope, I’ll be able to tell with confidence. What disappointed me was the low amplitude. The peak value was around 1.76 - 1.8V despite the 3.3V at the line #3 IO supply. The datasheet of LMK03328 states the following: “The 1.8-V LVCMOS driver supports rail-to-rail output swing only when powered from VDDO = 1.8 V +/- 5% (recommended VDDO for use with LVCMOS output format). VOH level is NOT rail-to-rail for VDDO = 2.5 V or 3.3 V due to the dropout voltage of the output channel’s internal LDO regulator.”

33.33MHz CMOS output

My expectation for peak amplitude was 2V or a little more. Let’s hope it's enough to clock the SOC. The driver for Zephyr OS is in a NASR-M-ZFW source tree. It’s a really simple one. First, it reads the register values described in a DTS, and then transfers them via the I2C. It works for me, and frankly speaking, I don’t want to spend any more time on this. At first, I tried to transfer the entire register config generated by TICS Pro, but that didn’t work. After a few tries, I had to cut out all register definitions that weren't related to the PLL or outputs, and it finally worked as expected.

Update The clock signal amplitude is ok. My oldie scope was not able to display the fast rising signal correctly. Here is the oscillogram made with a faster scope.

33.33MHz with a decent scope

Here is a DTS example:


    lmk03328: lmk03328@54 {
    compatible = "ti,lmk03328";
    init-priority = <90>;
    reg = <0x54>;
    /*software-reset;*/    /* clear R12[7] after writing all registers */

    status = "okay";

    reg-values = <
           0x1D01  /* R29  enable AC coupling mode on a primary input*/
           0x0232  /* R2     addr=0x02  val=0x32 */
           0x0300  /* R3     addr=0x03  val=0x00 */
           0x0CDF  /* R12    addr=0x0C  val=0xDF */
           0x0D00  /* R13    addr=0x0D  val=0x00 */
           0x0E00  /* R14    addr=0x0E  val=0x00 */
           0x1800  /* R24    addr=0x18  val=0x00 */
           0x19F5  /* R25    addr=0x19  val=0xF5 */
           0x14FF  /* R20    addr=0x14  val=0xFF */
           0x15FF  /* R21    addr=0x15  val=0xFF */
           0x16FF  /* R22    addr=0x16  val=0xFF */
           0x1702  /* R23    addr=0x17  val=0x02 */
           0x1B58  /* R27    addr=0x1B  val=0x58 */
           0x1C28  /* R28    addr=0x1C  val=0x28 */
           0x1D03  /* R29    addr=0x1D  val=0x03 */
           0x1E0C  /* R30    addr=0x1E  val=0x0C */
           0x1F20  /* R31    addr=0x1F  val=0x20 */
           0x2030  /* R32    addr=0x20  val=0x30 */
           0x2127  /* R33    addr=0x21  val=0x27 */
           0x2230  /* R34    addr=0x22  val=0x30 */
           0x237C  /* R35    addr=0x23  val=0x7C */
           0x2427  /* R36    addr=0x24  val=0x27 */
           0x2510  /* R37    addr=0x25  val=0x10 */
           0x262F  /* R38    addr=0x26  val=0x2F */
           0x2710  /* R39    addr=0x27  val=0x10 */
           0x282F  /* R40    addr=0x28  val=0x2F */
           0x2950  /* R41    addr=0x29  val=0x50 */
           0x2A0E  /* R42    addr=0x2A  val=0x0E */
           0x790F  /* R121   addr=0x79  val=0x0F */
           0x7A0F  /* R122   addr=0x7A  val=0x0F */
           0x7B0F  /* R123   addr=0x7B  val=0x0F */
           0x7C0F  /* R124   addr=0x7C  val=0x0F */
           0x2B50  /* R43    addr=0x2B  val=0x50 */
           0x2C0E  /* R44    addr=0x2C  val=0x0E */
           0x2D0A  /* R45    addr=0x2D  val=0x0A */
           0x2E00  /* R46    addr=0x2E  val=0x00 */
           0x2F00  /* R47    addr=0x2F  val=0x00 */
           0x30FF  /* R48    addr=0x30  val=0xFF */
           0x3205  /* R50    addr=0x32  val=0x05 */
           0x3303  /* R51    addr=0x33  val=0x03 */
           0x3400  /* R52    addr=0x34  val=0x00 */
           0x3500  /* R53    addr=0x35  val=0x00 */
           0x3600  /* R54    addr=0x36  val=0x00 */
           0x3700  /* R55    addr=0x37  val=0x00 */
           0x380E  /* R56    addr=0x38  val=0x0E */
           0x3915  /* R57    addr=0x39  val=0x15 */
           0x3A00  /* R58    addr=0x3A  val=0x00 */
           0x3B62  /* R59    addr=0x3B  val=0x62 */
           0x3C00  /* R60    addr=0x3C  val=0x00 */
           0x3D00  /* R61    addr=0x3D  val=0x00 */
           0x8407  /* R132   addr=0x84  val=0x07 */
           0x8505  /* R133   addr=0x85  val=0x05 */
           0x3E22  /* R62    addr=0x3E  val=0x22 */
           0x3F00  /* R63    addr=0x3F  val=0x00 */
           0x4000  /* R64    addr=0x40  val=0x00 */
           0x412D  /* R65    addr=0x41  val=0x2D */
           0x4203  /* R66    addr=0x42  val=0x03 */
           0x431A  /* R67    addr=0x43  val=0x1A */
           0x4403  /* R68    addr=0x44  val=0x03 */
           0x457D  /* R69    addr=0x45  val=0x7D */
           0x4607  /* R70    addr=0x46  val=0x07 */
           0x4712  /* R71    addr=0x47  val=0x12 */
           0x4818  /* R72    addr=0x48  val=0x18 */
           0x4900  /* R73    addr=0x49  val=0x00 */
           0x4A5A  /* R74    addr=0x4A  val=0x5A */
           0x4B00  /* R75    addr=0x4B  val=0x00 */
           0x4C00  /* R76    addr=0x4C  val=0x00 */
           0x4D00  /* R77    addr=0x4D  val=0x00 */
           0x5001  /* R80    addr=0x50  val=0x01 */
           0x510C  /* R81    addr=0x51  val=0x0C */
           0x5208  /* R82    addr=0x52  val=0x08 */
           0x5301  /* R83    addr=0x53  val=0x01 */
           0x5404  /* R84    addr=0x54  val=0x04 */
           0x5507  /* R85    addr=0x55  val=0x07 */
           0x5600  /* R86    addr=0x56  val=0x00 */
           0x5700  /* R87    addr=0x57  val=0x00 */
           >;
    };

Now that the clock works, I can start soldering the flash storage and supporting circuitry.

Tags: nasr-m, zephyr, embedded