Re: Serial connection is garbled at 32MHz
Greg Ungerer <[email protected]> Thu, 17 Apr 2008 15:41:13 +1000
| Newsgroups | gmane.comp.hardware.motorola.microcontrollers.coldfire |
|---|---|
| Message-ID | <[email protected]> |
Hi Loren,
Loren A. Linden Levy wrote:
> So this is really funny if I calculate the UBG1(2) values in this way:
>
> #if defined(CONFIG_CLOCK_32MHz) && defined(CONFIG_M5282)
> printk("Alex's baud rate hack!!!\n");
> baudclk = ((2*MCF_BUSCLK / mcfrs_baud_table[i]) + 16 ) / 32;
>
> rather than:
>
> #else
> baudclk = ((MCF_BUSCLK / mcfrs_baud_table[i]) + 16) / 32;
> #endif
>
> I get 19200 baud rate. What the heck is going on here....
Hmmm, you didn't change coldfire.h did you?
It has conditional code for some ColdFire CPU types that
divides the master clock frequency by 2 to get that MCF_BUSCLK.
Though the 5282 is not one of them normally.
Regards
Greg
> On Mon, 07 Apr 2008 10:50:44 +1000
> Greg Ungerer <[email protected]> wrote:
>
>> Hi Loren,
>>
>> Loren A. Linden Levy wrote:
>>> On Fri, 04 Apr 2008 11:06:59 +1000
>>> Greg Ungerer <[email protected]> wrote:
>>>> Allon Stern wrote:
>>>>> On Apr 3, 2008, at 2:20 PM, Loren A. Linden Levy wrote:
>>>>>> So I am making progress with this external FPGA (thanks to all the
>>>>>> help) and I have the code basically working (I think). One thing we
>>>>>> are doing is artificially running the chip (M%282) at 32MHz and this
>>>>>> screws up the display over serial (I get nonsense characters). This is
>>>>>> not too big a deal b/c I can connect just fine over telnet I was just
>>>>>> wondering if there was an obvious way to fix it (settings?). Thanks
>>>>>> again.
>>>>> I'd suggest looking at (assuming 2.6) linux2.6.x/drivers/serial/mcfserial.c
>>>>>
>>>>> Look for the line (#636 in my kernel):
>>>>> /* compute the baudrate clock */
>>>>>
>>>>> This is where it determines the baudrate clock based on the CPU clock.
>>>>>
>>>>> It appears to be based off of MCF_BUSCLK, which is defined in
>>>>> linux2.6.x./include/asm-m68knommu/coldfire.h as
>>>>> #define MCF_BUSCLK (CONFIG_CLOCK_FREQ / CONFIG_CLOCK_DIV)
>>>>>
>>>>> Both CONFIG_CLOCK_FREQ and CONFIG_CLOCK_DIV are defined in your .config.
>>>> That is right. If you are just feeding a different master
>>>> clock to the 5282 then the right change to make is to
>>>> CONFIG_CLOCK_FREQ. Look for the config menu item with the
>>>> text "Set the core clock frequency". This is only in 2.6.x
>>>> kernels.
>>>>
>>>> If using a 2.4.x kernel then you need to change the clock
>>>> frequency manually in the source (look in
>>>> linux-2.4.x/include/asm-arm/coldfire.h).
>>>
>>> It is a 2.4.x kernel and I actually already added the 32MHz option
>>> (coldfire.h):
>>>
>>> --- linux-2.4.x/include/asm-m68knommu/coldfire.h 25 Sep 2007 06:25:01 -0000 1.19
>>> +++ linux-2.4.x/include/asm-m68knommu/coldfire.h 4 Apr 2008 17:46:52 -0000
>>> @@ -38,6 +38,7 @@
>>> /*
>>> * Define master clock frequency.
>>> */
>>> +
>>> #if defined(CONFIG_CLOCK_11MHz)
>>> #define MCF_CLK 11289600
>>> #elif defined(CONFIG_CLOCK_16MHz)
>>> @@ -50,6 +51,8 @@
>>> #define MCF_CLK 25000000
>>> #elif defined(CONFIG_CLOCK_29_5MHz)
>>> #define MCF_CLK 29500000
>>> +#elif defined(CONFIG_CLOCK_32MHz)
>>> +#define MCF_CLK 32000000
>>> #elif defined(CONFIG_CLOCK_33MHz)
>>> #define MCF_CLK 33000000
>>> #elif defined(CONFIG_CLOCK_40MHz)
>>>
>>>
>>> and an entry in the config.in file for kernel configuration.
>>>
>>> --- linux-2.4.x/arch/m68knommu/config.in 25 Sep 2007 06:25:01 -0000 1.76
>>> +++ linux-2.4.x/arch/m68knommu/config.in 4 Apr 2008 17:46:09 -0000
>>> @@ -34,7 +34,6 @@
>>> endmenu
>>>
>>> #############################################################################
>>> -
>>> mainmenu_option next_comment
>>> comment 'Processor type and features'
>>>
>>> @@ -93,6 +92,7 @@
>>> 24MHz CONFIG_CLOCK_24MHz \
>>> 25MHz CONFIG_CLOCK_25MHz \
>>> 29.5MHz CONFIG_CLOCK_29_5MHz \
>>> + 32MHz CONFIG_CLOCK_32MHz \
>>> 33MHz CONFIG_CLOCK_33MHz \
>>> 40MHz CONFIG_CLOCK_40MHz \
>>> 45MHz CONFIG_CLOCK_45MHz \
>>>
>>>
>>> Now I am a little confused about the serial baudrate calculation (I
>>> found it is actually in the file drivers/char/mcfserial.c).
>>>
>>> For the M5282 the calculation is:
>>>
>>> #else
>>> baudclk = ((MCF_BUSCLK / mcfrs_baud_table[i]) + 16) / 32;
>>> #endif
>>>
>>> Which is basically identical to what I found in the manual. Here the
>>> baud_rate table entry is number 14 which is 19200. So the baudclck for
>>> 32MHz and 66MHz come out to be 52 and 180 respectively. I guess i do not understand why I am getting junk out if the clock calculation here is being mad correctly. I am in the process of looking throiugh the UART UBG settings to se iff there is something I am missing. Any input or hints would be appreciated.
>> Seems like you have taken the correct approach.
>>
>> Regards
>> Greg
>>
>>
>>
>> ------------------------------------------------------------------------
>> Greg Ungerer -- Chief Software Dude EMAIL: [email protected]
>> Secure Computing Corporation PHONE: +61 7 3435 2888
>> 825 Stanley St, FAX: +61 7 3891 3630
>> Woolloongabba, QLD, 4102, Australia WEB: http://www.SnapGear.com
>> ---
>> [email protected] Send a post to the list.
>> [email protected] Join the list.
>> [email protected] Join the list in digest mode.
>> [email protected] Leave the list.
>>
>
>
--
------------------------------------------------------------------------
Greg Ungerer -- Chief Software Dude EMAIL: [email protected]
SnapGear -- a Secure Computing Company PHONE: +61 7 3435 2888
825 Stanley St, FAX: +61 7 3891 3630
Woolloongabba, QLD, 4102, Australia WEB: http://www.SnapGear.com
---
[email protected] Send a post to the list.
[email protected] Join the list.
[email protected] Join the list in digest mode.
[email protected] Leave the list.