扎扎实实作技术
今天突然想起以前老师的话
对
扎扎实实做学问,努力学技术
实事求是
这些朴素的字眼自己现在才明白其中的深意
感谢老师,感谢学校的培养,
感谢父母
感谢yn
路漫漫其修远兮,吾将上下而求索。
Linux环境下的软件安装,并不是一件容易的事情;如果通过源代码编译后在安装,当然事情就更为复杂一些;现在安装各种软件的教程都非常普遍;但万变不离其中,对基础知识的扎实掌握,安装各种软件的问题就迎刃而解了。Configure脚本配置工具就是基础之一,它是autoconf的工具的基本应用。
与一些技巧相比,Configure显得基础一些,当然使用和学习起来就显得枯燥乏味一些,当然要成为高手,对基础的熟悉不能超越哦。
为此我转载了一篇关于Configure选项配置的详细介绍。供大家参考
'configure'脚本有大量的命令行选项.对不同的软件包来说,这些选项可能会有变化,但是许多基本的选项是不会改变的.带上'--help'选项执行'configure'脚本可以看到可用的所有选项.尽管许多选项是很少用到的,但是当你为了特殊的需求而configure一个包时,知道他们的存在是很有益处的.下面对每一个选项进行简略的介绍:
--cache-file=FILE
'configure'会在你的系统上测试存在的特性(或者bug!).为了加速随后进行的配置,测试的结果会存储在一个cache file里.当configure一个每个子树里都有'configure'脚本的复杂的源码树时,一个很好的cache file的存在会有很大帮助.
--help
输出帮助信息.即使是有经验的用户也偶尔需要使用使用'--help'选项,因为一个复杂的项目会包含附加的选项.例如,GCC包里的'configure'脚本就包含了允许你控制是否生成和在GCC中使用GNU汇编器的选项.
--no-create
'configure'中的一个主要函数会制作输出文件.此选项阻止'configure'生成这个文件.你可以认为这是一种演习(dry run),尽管缓存(cache)仍然被改写了.
--quiet
--silent
当'configure'进行他的测试时,会输出简要的信息来告诉用户正在作什么.这样作是因为'configure'可能会比较慢,没有这种输出的话用户将会被扔在一旁疑惑正在发生什么.使用这两个选项中的任何一个都会把你扔到一旁.(译注:这两句话比较有意思,原文是这样的:If there was no such output, the user would be left wondering what is happening. By using this option, you too can be left wondering!)
--version
打印用来产生'configure'脚本的Autoconf的版本号.
--prefix=PEWFIX
'--prefix'是最常用的选项.制作出的'Makefile'会查看随此选项传递的参数,当一个包在安装时可以彻底的重新安置他的结构独立部分. 举一个例子,当安装一个包,例如说Emacs,下面的命令将会使Emacs Lisp file被安装到"/opt/gnu/share":
$ ./configure --prefix=/opt/gnu
--exec-prefix=EPREFIX
与'--prefix'选项类似,但是他是用来设置结构倚赖的文件的安装位置.编译好的'emacs'二进制文件就是这样一个问件.如果没有设置这个选项的话,默认使用的选项值将被设为和'--prefix'选项值一样.
--bindir=DIR
指定二进制文件的安装位置.这里的二进制文件定义为可以被用户直接执行的程序.
--sbindir=DIR
指定超级二进制文件的安装位置.这是一些通常只能由超级用户执行的程序.
--libexecdir=DIR
指定可执行支持文件的安装位置.与二进制文件相反,这些文件从来不直接由用户执行,但是可以被上面提到的二进制文件所执行.
--datadir=DIR
指定通用数据文件的安装位置.
--sysconfdir=DIR
指定在单个机器上使用的只读数据的安装位置.
--sharedstatedir=DIR
指定可以在多个机器上共享的可写数据的安装位置.
--localstatedir=DIR
指定只能单机使用的可写数据的安装位置.
--libdir=DIR
指定库文件的安装位置.
--includedir=DIR
指定C头文件的安装位置.其他语言如C++的头文件也可以使用此选项.
--oldincludedir=DIR
指定为除GCC外编译器安装的C头文件的安装位置.
--infodir=DIR
指定Info格式文档的安装位置.Info是被GNU工程所使用的文档格式.
--mandir=DIR
指定手册页的安装位置.
--srcdir=DIR
这个选项对安装没有作用.他会告诉'configure'源码的位置.一般来说不用指定此选项,因为'configure'脚本一般和源码文件在同一个目录下.
--program-prefix=PREFIX
指定将被加到所安装程序的名字上的前缀.例如,使用'--program-prefix=g'来configure一个名为'tar'的程序将会使安装的程序被命名为'gtar'.当和其他的安装选项一起使用时,这个选项只有当他被`Makefile.in'文件使用时才会工作.
--program-suffix=SUFFIX
指定将被加到所安装程序的名字上的后缀.
--program-transform-name=PROGRAM
这里的PROGRAM是一个sed脚本.当一个程序被安装时,他的名字将经过`sed -e PROGRAM'来产生安装的名字.
--build=BUILD
指定软件包安装的系统平台.如果没有指定,默认值将是'--host'选项的值.
--host=HOST
指定软件运行的系统平台.如果没有指定,将会运行`config.guess'来检测.
--target=GARGET
指定软件面向(target to)的系统平台.这主要在程序语言工具如编译器和汇编器上下文中起作用.如果没有指定,默认将使用'--host'选项的值.
--disable-FEATURE
一些软件包可以选择这个选项来提供为大型选项的编译时配置,例如使用Kerberos认证系统或者一个实验性的编译器最优配置.如果默认是提供这些特性,可以使用'--disable-FEATURE'来禁用它,这里'FEATURE'是特性的名字.例如:
$ ./configure --disable-gui
-enable-FEATURE[=ARG]
相反的,一些软件包可能提供了一些默认被禁止的特性,可以使用'--enable-FEATURE'来起用它.这里'FEATURE'是特性的名字.一个特性可能会接受一个可选的参数.例如:
$ ./configure --enable-buffers=128
`--enable-FEATURE=no'与上面提到的'--disable-FEATURE'是同义的.
--with-PACKAGE[=ARG]
在自由软件社区里,有使用已有软件包和库的优秀传统.当用'configure'来配置一个源码树时,可以提供其他已经安装的软件包的信息.例如,倚赖于Tcl和Tk的BLT器件工具包.要配置BLT,可能需要给'configure'提供一些关于我们把Tcl和Tk装的何处的信息:
$ ./configure --with-tcl=/usr/local --with-tk=/usr/local
'--with-PACKAGE=no'与下面将提到的'--without-PACKAGE'是同义的.
--without-PACKAGE
有时候你可能不想让你的软件包与系统已有的软件包交互.例如,你可能不想让你的新编译器使用GNU ld.通过使用这个选项可以做到这一点:
$ ./configure --without-gnu-ld
--x-includes=DIR
这个选项是'--with-PACKAGE'选项的一个特例.在Autoconf最初被开发出来时,流行使用'configure'来作为Imake的一个变通方法来制作运行于X的软件.'--x-includes'选项提供了向'configure'脚本指明包含X11头文件的目录的方法.
--x-libraries=DIR
类似的,'--x-libraries'选项提供了向'configure'脚本指明包含X11库的目录的方法.
在源码树中运行'configure'是不必要的同时也是不好的.一个由'configure'产生的良好的'Makefile'可以构筑源码属于另一棵树的软件包.在一个独立于源码的树中构筑派生的文件的好处是很明显的:派生的文件,如目标文件,会凌乱的散布于源码树.这也使在另一个不同的系统或用不同的配置选项构筑同样的目标文件非常困难.建议使用三棵树:一棵源码树(source tree),一棵构筑树(build tree),一棵安装树(install tree).这里有一个很接近的例子,是使用这种方法来构筑GNU malloc包:
$ gtar zxf mmalloc-1.0.tar.gz
$ mkdir build && cd build
$ ../mmalloc-1.0/configure
creating cache ./config.cache
checking for gcc... gcc
checking whether the C compiler (gcc ) works... yes
checking whether the C compiler (gcc ) is a cross-compiler... no
checking whether we are using GNU C... yes
checking whether gcc accepts -g... yes
checking for a BSD compatible install... /usr/bin/install -c
checking host system type... i586-pc-linux-gnu
checking build system type... i586-pc-linux-gnu
checking for ar... ar
checking for ranlib... ranlib
checking how to run the C preprocessor... gcc -E
checking for unistd.h... yes
checking for getpagesize... yes
checking for working mmap... yes
checking for limits.h... yes
checking for stddef.h... yes
updating cache ../config.cache
creating ./config.status
这样这棵构筑树就被配置了,下面可以继续构筑和安装这个包到默认的位置'/usr/local':
$ make all && make install
UDEV,新一代的用户空间设备管理系统,用以取代臃肿的DEVFS(其实DEVFS我还没用过,谁叫我是新来的 ^_^ ,关于两者的对比,可以参考 udev_vs_devfs )。关于UDEV的使用已经有一遍不错的译文 udev轻松上路 ,不过里面关于配置文件的编写与 Writing udev rules 不符。/etc/udev/udev.conf 是udev启动检查的配置文件,包括路径,权限,规则目录等,具体的规则文件应该为/etc/udev/rules.d/10-local.rules 。
我开始移植的第一个Linux是2.6.19.2,已放弃对DEVFS的支持,下面谈谈UDEV在我的arm开发板上的应用。由于BusyBox已带有一个简化板的udev--mdev。通过简单的 mdev -s ,就能自动装配/dev目录下的设备文件:
# ls /dev
console null ptmx pts shm
# mdev -s && ls /dev
apm_bios ptypd tty24 tty56
console ptype tty25 tty57
fb0 ptypf tty26 tty58
full ram0 tty27 tty59
kmem ram1 tty28 tty6
kmsg ram2 tty29 tty60
loop0 ram3 tty3 tty61
... ...
启动热拔插支持的话,用这一句
echo /sbin/mdev > /proc/sys/kernel/hotplug
一切就是这么简单,相应的/dev目录下会出现一大堆设备文件,甚是难看 ^_^
mdev的规则文件是/etc/mdev.conf ,与传统的udev规则文件写法上有点区别(简化了^_^)。
KERNEL=="tty[0-9]*", NAME="vc/%n" //for udev
tty[0-9]* 0:5 660 //for mdev
如果选上FEATURE_MDEV_EXEC支持,规则后面可以执行相应的命令,如:
pts/ 0:0 755 $mount -t devpts /dev/pts /dev/pts
不过我的程序还算简单,mdev -s 对我而言已足够,规则,留作日后写吧 ^_^
我用的是mdev,因为简单 ^_^
在启动教本(如:linuxrc)加入这两句就搞定:
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
今天在板子上移植了2.6.22内核,用uboot能正常引导进入cramfs文件系统,但是cs8900a网卡还不能正常工作,明天继续加油,得好好研究研究这块了。
主要是参考http://hi.baidu.com/wangy0919/blog/
这个blog收集的文章很全,呵呵,虽然不是原创,但是也难能可贵的,我也受益匪浅,谢谢blog主人了。
基本没出什么大问题,就是在制作根文件系统的时候,有点小问题,还有就是uboot的bootargs参数设置
入职半年了,迎来了工作生涯的第一个联合会,今晚和老陈,pan,fan练习了一晚上的歌,虽然自己五音不全,不过每个人都有节目,所以自己也得准备个,再说了能和老陈一起唱歌心里也挺开心的,老陈人不错,对下属随和,有亲切感,自己还是很爱和他一起做些什么的。
希望明天能有出色的发挥。
有几天没写blog的,这段有点忙,今天移植成功uboot心里还是很高兴的,这是自己偷偷的移植的,主管要是知道了又得说干和工作无关的事了,什么是和工作有关的?我一直不明白
他说什么有关就是什么有关?不学习,到用的时候从天上来?谁都得学习啊!算了自己就是一个打工的,随便吧,不行了我考研行了吧。真是的!
只许州官放火,不许百姓点灯,说起来还一套一套的,自己是怎么做的?
哎,社会啊
算了,走自己的路,别人去说吧。
。。。。。。。。。。。。。。。。。。
志存高远!
希望能学到更多的知识,也顺便感谢下yani,最近有些对不住她,对她的照顾少了些,相信我吧
会给你个明媚灿烂的明天的!
fighting!
1、为了能使得U-BOOT正确引导linux内核。必须传递合适的参数给内核。
修改include/configs/zj2410.h如下:
/************************************************************
* RTC
************************************************************/
#define CONFIG_RTC_S 24X0 1
/* allow to overwrite serial and ethaddr */
#define CONFIG_ENV_OVERWRITE
#define CONFIG_BAUDRATE 115200
/************************************************************/
/* My Add */
/* enable passing of ATAGs */#define CONFIG_CMDLINE_TAG 1
#define CONFIG_SETUP_MEMORY_TAGS 1
#define CONFIG_INITRD_TAG 1
/***********************************************************
* Command definition
***********************************************************/
#define CONFIG_COMMANDS \
(CONFIG_CMD_DFL | \
CFG_CMD_CACHE | \
CFG_CMD_NAND | \
/*CFG_CMD_EEPROM |*/ \
/*CFG_CMD_I |*/ \
/*CFG_CMD_USB |*/ \
CFG_CMD_REGINFO | \
CFG_CMD_DATE | \
CFG_CMD_ELF)
2、为了能稳定正确引导linux内核,得修改UBOOT的2410CPU频率。
smdk2410的U-BOOT原来运行频率是 ,在这个频率我已开始能正确引导内核,但是后来突然就不能引导了,
总是死在下面这个地方:
Uncompressing Linux....................................................... done, booting the kernel.
按照网上的说法,内核中,在\arch\arm\mach_s 2410\s 2410.c 中
fclk = s 2410_get_pll(MPLLCON, xtal); //读出来的fclk结果和bootloader的频率不一致。
既然不能用 ,VIVI的 能跑得好好的,那我把U-BOOT的频率改成 , 2.6.20 .3的内核和阳初光盘的2.4.18的内核都能正确稳定地引导了。
修改board/yangchu2410/smdk2410.c文件如下:
#define FCLK_SPEED 1
#if FCLK_SPEED==0 /* Fout = 203MHz, Fin = 12MHz for Audio */
#define M_MDIV 0xC3
#define M_PDIV 0x4
#define M_SDIV 0x1
#elif FCLK_SPEED==1 /* Fout = 202.8MHz */
//#define M_MDIV 0xA1
//#define M_PDIV 0x3
//#define M_SDIV 0x1
#define M_MDIV 0x /* Fout = 200MHz */
#define M_PDIV 0x4
#define M_SDIV 0x0
#endif
好了,编译烧写U-BOOT到NAND FLASH,通过setenv 设置bootargs,引导内核时就可以将bootargs传递给内核了。
注意:
1、 对于U-BOOT而言,启动内核时候使用bootm命令才能传递内核参数,使用go命令是不传递内核参数的。
2、 bootm命令引导的只能是用U-BOOT的mkimage工具做过的内核映像,所以要引导阳初光盘带的内核映像,必须用其工具转换一下,至于这个工具怎么用,到U-BOOT的tools目录下找这个工具去吧,./mkimage --help 或者网上找找资料看下就知道了。^_^。
这两天有点空闲时间,自己忙里偷闲,偷偷的在实验室的板子上移植了uboot
板子是我们自己制版焊接的,所以稳定性不是很好,不过凑合也能正常工作,一直以来工作都是用vivi,但是这个版本的vivi没有tftp下载功能,所以用xmodem协议下载zImage的时候太漫长了,而自己想移植个带tftp功能的vivi,可是由于没那么多时间就一直没成功,一直uboot也是试试,如果折腾折腾没成功,估计最后也得放弃,毕竟现在没那么多时间,而且主管也没给那个时间,这一切都是凭着工作之余,自己的兴趣所在。
板子是参考广州斯道2410的公版,还有友善之臂,反正内核什么的都没改直接就用他们的这些能正常在我们的板子上跑,我想硬件都一样吧,要不然也不能正常的跑,而且都是smdk2410公版的修改,(硬件是另一个同事做的,我具体不是很懂,不过应该和我想想的一样)
uboot是1.1.4的主要参考了
要参考了luofuchong 大侠
http://www.hhcn.com/cgi-bin/topic.cgi?forum=3&topic=562&start=0&show=
和bekars大侠
http://dev.csdn.net/article/84/84538.shtm
代码就是直接下载的xiaoluo的代码,然后打上他的补丁就ok了
make distclean
make clean
make smdk2410_config
make
就可以生成u-boot.bin了
用sjf2410烧写可以看到能够在板子上启动
一切都比较顺利(我想这都是因为xiaoluo都已经改过了)
但是还是有些问题,那就是不能正常引导内核
到Uncompressing Linux....................................................... done, booting the kernel的时候就停住了
这时候自己连uboot的基本命令都还不懂,又上网查了查用法
继续试验,还是不行,后来参考了另一个帖子,说是因为内核参数没有正确传递的原因,内核应该启动起来了,可是就是没有输出信息,和我在调试其他驱动的时候把console设为tty0一样,于是就朝着这个方向去解决问题
修改board目录下smdk2410.c
#if FCLK_SPEED==0 /* Fout = 203MHz, Fin = 12MHz for Audio */
#define M_MDIV 0xC3
#define M_PDIV 0x4
#define M_SDIV 0x1
#elif FCLK_SPEED==1 /* Fout = 202.8MHz */
//#define M_MDIV 0xA1
//#define M_PDIV 0x3
//#define M_SDIV 0x1
#define M_MDIV 0x
#define M_PDIV 0x4
#define M_SDIV 0x0
#endif
在include/configs/smdk2410.h中加上
#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */
#define CONFIG_SETUP_MEMORY_TAGS 1
#define CONFIG_INITRD_TAG 1
然后重新编译uboot
重新下载后,问题还是一样,很是郁闷,就有上网抠,查到还有人说是频率不对,我下面转的
"board/smdk2410/smdk2410.c"
#define FCLK_SPEED 1
#if FCLK_SPEED==0 /* Fout = 203MHz, Fin = 12MHz for Audio */
#define M_MDIV 0xC3
#define M_PDIV 0x4
#define M_SDIV 0x1
#elif FCLK_SPEED==1 /* Fout = 202.8MHz */
//#define M_MDIV 0xA1
//#define M_PDIV 0x3
//#define M_SDIV 0x1
#define M_MDIV 0x5c /* Fout = 200MHz */
#define M_PDIV 0x4
#define M_SDIV 0x0
#endif
#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */
#define CONFIG_SETUP_MEMORY_TAGS 1
#define CONFIG_INITRD_TAG 1
这个还没有机会试验呢,但是我想也应该有作用的这个好东西是从阳初论坛上下载的。我自己还没有研究,希望有兴趣的朋友可以研究一下。附件上有源代码,还有专门的word文档说明。以后研究了再放上更多的详细介绍,先发给大家玩玩!最近忙考试和制作简历,没时间!!呵呵!!!!!
以下是作者在论坛的讨论的内容:
晕死,发了半天,居然都没发上来,说我字数限制,我都没几个字。
只能传了。
写的匆忙,还没来得及改,有错的地方,望各位指出。^_^
我的工作环境:
RedHat 9
arm-linux-gcc 4.1.1(glibc2.3.2)
U-BOOT1.2.0
目标板:阳初S3C2410开发板V2.3版
买回来,板子上没有NOR FLASH,给的也只有VIVI,我想用U-BOOT(这个用的比较广),所以只能修改U-BOOT从NAND FLASH启动了。
我的内容包括:
NAND FLASH启动;
NAND FLASH驱动,让U-BOOT可以对NAND FLASH读写;
环境变量保存到NAND FLASH。
引导linux内核
参照的主要是网上的文章,我只不过相当于拼凑了一下。呵呵。
我晕,大小上传也只有100KB。只能压缩传了。
顺便把U-BOOT中修改后的几个文件也发上来:
点击浏览该文件
编译后的U-BOOT.bin,可以利用JTAG烧写到NAND FLASH运行的:
点击浏览该文件
晕,之前做的U-BOOT不能正确阳初光盘编译好的linux映像内核。
下载到板子上0x30008000运行,不行,用bootm和go命令的结果都是和前面的结果一样,最后死在这里:
……
……
Uncompressing Linux....................................................... done, booting the kernel.
往下就没了。网上查了很多文章,说法不一,各人的遇到的特殊情况不同吧。
于是,我用2.6.20.3源码make s3c2410_defconfig默认配置,编译了一下,在板子上跑了一下,结果跑起来了,但是查看启动信息,发现U-BOOT的bootargs并没传递给内核:
U-BOOT的bootargs如下:
bootargs=root=/dev/ram rw initrd="0x308000",6000000 console="ttyS0",115200 mem="64M"
而内核启动显示如下:
Kernel command line: root="/dev/hda1" ro init="/bin/bash" console="ttySAC0"
说明U-BOOT并没有设置bootargs到参数里去。
再查看U-BOOT的include/configs/yangchu2410.h文件,发现没有定义如下:
#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */
#define CONFIG_SETUP_MEMORY_TAGS 1
#define CONFIG_INITRD_TAG 1
而#define CONFIG_CMDLINE_TAG 1是在传递cmdline时候必须设置的,所以在include/configs/yangchu2410.h文件中添加如上定义。
定义之后,重新编译U-BOOT,烧写到NAND FLASH中,启动板子。
再跑上面编译的2.6.20.3linux,内核启动信息中显示的参数信息和U-BOOT中设置的一致了。
设置U-BOOT的bootargs:noinitrd root="/dev/mtdblock/2" console="ttyS0" mac="00:01:5d:68:7a:0f",再跑阳初光盘带的linxu内核,往下看到兴奋的字眼了:
YANGCHU2410 # bootm 30008000
## Booting image at 30008000 ...
Image Name: yangchu_linux2.4.18
Created: 2007-08-26 8:06:16 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 772272 Bytes = 754.2 kB
Load Address: 30008000
Entry Point: 30008040
Verifying Checksum ... OK
XIP Kernel Image ... OK
Starting kernel ...
Uncompressing Linux....................................................... done, booting the kernel.
Linux version 2.4.18-rmk7-pxa1 (fc@localhost.localdomain) (gcc version 2.95.3 20010315 (release)) #441 7 10 11:29:04 CST 2007
CPU: ARM/CIRRUS Arm920Tsid(wb) revision 0
Machine: Samsung-SMDK2410
On node 0 totalpages: 16384
zone(0): 16384 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: noinitrd root="/dev/mtdblock/2" console="ttyS0" mac="00:01:5d:68:7a:0f"
……
……
楼顶的文章我已经改过了,上传了我更新过的文章。
相应要要修改的U-BOOT以及编译好的uboot.bin也重新上传了
UBOOT引导内核真是搞怪,前几天还能引导的,这几天又不能引导了,但是这些内核用VIVI都是能引导的,搞得头痛死了,总是死在下面这个地方:
Uncompressing Linux....................................................... done, booting the kernel.
后来发现是频率的问题。因为网上有人也遇到此问题,相关说法如下:
之后用仿真器追踪内核结果发现:
start_kernel函数的time_init()中程序进入死循环~~
我随之进入time_init()
继续进入 system_timer->init();
结果发现,我的fclk,pclk都不能得到正确的值,积存器正确,我拿笔都能算出来,可是他就是总出错,所以我一气之下把他们全部写死.
具体如下:
在\arch\arm\mach_s3c2410\s3c2410.c 中 搜索 fclk ;
fclk = s3c2410_get_pll(MPLLCON, xtal); //这是他原来的,结果不是我们想要的200MHZ
fclk =200*1000*1000 ; // 这是我加的
在\arch\arm\mach_s3c2410\time.c 中搜索 pclk:
pclk = clk_get_rate(clk); //这是原来的
pclk = 50*1000*1000; //这是我加的
当然这都是根据2410的DATASHEET而定的
我现在用的是FCLK : HCLK : PCLK = 1 : 2 : 4 ,所以我分别写死为200M 100M 50M.
看来我的问题差不多也出在这边了,fclk得不到正确的值,由于没有仿真器,只能这么推测了。因为我终端上显示出来的传递参数都没有问题。
我再看了看VIVI,它里面用的就是200M。
smdk2410的U-BOOT原来运行频率是202.8M,后来把U-BOOT的频率改成200M,2.6.20.3的内核和阳初光盘的2.4.18的内核都能稳定地引导了。
修改文件如下:
"board/yangchu2410/smdk2410.c"
#define FCLK_SPEED 1
#if FCLK_SPEED==0 /* Fout = 203MHz, Fin = 12MHz for Audio */
#define M_MDIV 0xC3
#define M_PDIV 0x4
#define M_SDIV 0x1
#elif FCLK_SPEED==1 /* Fout = 202.8MHz */
//#define M_MDIV 0xA1
//#define M_PDIV 0x3
//#define M_SDIV 0x1
#define M_MDIV 0x5c /* Fout = 200MHz */
#define M_PDIV 0x4
#define M_SDIV 0x0
#endif