当前位置: 首页 > news >正文

广州网站设计总部python工程打包供网站开发调用

广州网站设计总部,python工程打包供网站开发调用,wordpress 调取页面缩略图,北票网站建设DM365的BSP主要包含mach-davinci和plat-davinci两个目录#xff08;及相关头文件#xff09;#xff0c;BSP复杂庞大又极其重要#xff0c;它主要完成了板级的初始化#xff0c;比如内存映射#xff0c;时钟和电源初始化#xff0c;中断和IO初始化#xff0c;CPU及各模…DM365的BSP主要包含mach-davinci和plat-davinci两个目录及相关头文件BSP复杂庞大又极其重要它主要完成了板级的初始化比如内存映射时钟和电源初始化中断和IO初始化CPU及各模块的初始化相关平台设备总线设备的注册等等。下面就分板一下DM365的BSP部分以程序流程为纵线以各个文件为横线进行分析。内核在经过一系列的初始化后会进行板级的初始化主要依靠一个MACHINE_START宏DM365的板定义宏在board-dm365-evm.c文件中这个宏有以下几个成员phys_ioio_pg_offstboot_paramsmap_ioinit_irqtimerinit_machine。这些成员变量或函数将会由内核在初始化时在适当的时机调用。DM365开发板对这几个成员都有针对其开发板的内容phy_io设置为0x01c00000这是DM365寄存器的起始地址。boot_params为0x80000100它在DDR中是用来存放UBOOT的传递参数的。map_io会调用davinci_map_io函数完成开发板的静态地址映射同时开发板中此函数还完成了MUX的功能初始化及各模块时钟的初始化。init_irq会调用davinci_dm365_evm_irq_init函数对开发板的中断系统进行初始化。timer会调用davinci_timer相关的成员它完成开发板的时间管理初始化。init_machine调用dm365_evm_init函数完成板级设备部分的初始化。下面我们从davinci_map_io函数开始。davinci_map_io函数主要由三个部分组成第一是中断优先级的初始化中断优先级的初始化就是将全局中断优先级结构指针davinci_irq_priorities指向一个默认的中断优先级数组dm365_default_priorities这个第二是调用davinci_map_common_io函数完成静态地址映射第三是调用davinci_init_common_hw函数完成MUX的功能初始化及各模块时钟的初始化。davinci_map_common_io函数最主要就是完成了一段物理地址的静态虚拟地址映射此后程序中操作这段物理地址的内容时不必再用ioremap动态得到一个虚拟地址了。至于如何做到映射的不用去深究只需要在map_desc结构定义的本平台使用的davinci_io_desc[]数组中中添加我们需要映射的地址段就可以了。开发板原程序中只映射了平台寄存器部分的地址空间其物理起始地址地址段大小欲映射成的虚拟起始地址等值填入这个结构中就可以了。这些值定义中io.h文件中其中物理起始地址IO_PHYS为0x01c00000这正是寄存器物理地址段的起始地址地址段大小IO_SIZE为0x00400000这两个值由手册都可以知道。至于欲映射成的虚拟起始地址则由我们人为决定可以选用IO_VIRT为0xfbc00000这样物理地址和虚拟地址就有一个简单的偏移关系IO_OFFSET为0xfa000000。有了这个偏移关系物理地址便和虚拟地址随时进行变换了我们可以封装一个宏IO_ADDRESS用来做为物理地址到虚拟地址的转换。这里需要特别注意的物理地址和虚拟地址的这层映射关系是内核来确定的而两个地址的简单偏移关系是我们人为决定的为了处理简单我们选了一个与物理地址有简单偏移关系的地址作为虚拟地址并让内核去认同。静态映射一定要搞清楚这里面的东西一开始很容易被迷惑的。davinci_map_common_io函数完成以后接着是davinci_init_common_hw函数。davinci_init_common_hw函数极其重要它里面只有两个函数davinci_mux_init函数完成模块引脚复用功能的初始化davinci_clk_init函数完成模块时钟的初始化。davinci_mux_init函数将各模块的复用进行初始化。它首先将几个重要的结构赋值davinci_pins是二维指针它被赋给一个和平台有关的默认的全局结构比如dm365_pins它是一个二维数组分别定义了若干模块及每个模块需要用到的引脚注意这个维数的索引值是对应模块在PSC管理中的索引值的。davinci_num_pins就是dm365_pins数组的维数。定义一个pin_config结构的指针table并指向一个默认的全局结构数组davinci_dm365_pinmux并得到这个数组的维数size。davinci_dm365_pinmux数组极其重要它的每一维元素都是一个pin_config结构它是用一个MUX_CFG宏来构造的用于模块引脚复用功能的选择实质是构造了欲对PINMUXx寄存器操作的位和欲写入的值。这个要好好理解配合手册中PINMUXx寄存器理解。几个结构赋值以后就调用davinci_mux_register函数这个函数将table赋给了全局结构指针pin_table将size赋给全局变量pin_table_sz将davinci_get_pins函数地址赋给函数指针get_pin_list将一个标识用到哪一个pinmux寄存器的数组首址赋给全局指针pinmux_in_use。davinci_get_pins这个函数的作用是通过参数ctr和id来返回davinci_pins数组的某一维它表示某一个模块用到的引脚。davinci_clk_init函数完成模块时钟的初始化。它首先将PSC寄存器的地址赋给全局指针psc_bases然后通过读取PLL相关的寄存器得到预分频倍频后分频分频等值注意这些设置都在UBL进行设置好了这里仅仅是读值这样就得到了各个模块的时钟值把它们赋给若干全局变量比如armratevoiceratecommonratevpssrateddrrate等。然后定义一个clk结构的指针clk_list并指向一个默认的全局结构数组davinci_dm365_clks并得到这个数组的维数num_clks。davinci_dm365_clks数组的每一维元素都是一个clk结构定义了平台各个模块的时钟管理参数包括模块名时钟值本模块在电源域的索引序号等。以后对某一模块进行时钟电源的开关就是操纵这个结构。然后调用davinci_enable_clks函数这个函数实质是循环调用了clk_register函数和clk_enable函数从而使能davinci_dm365_clks数组中定义的每一个模块的电源时钟。clk_register函数将当前模块放入全局的clocks链表中而后根据usecount的判断值调用clk_enable函数再调用__clk_enable函数而其最终调用davinci_psc_config函数完成某一模块的时钟电源使能。需要特别注意的是此时几乎全部模块的usecount都不满足不会调用clk_enable函数而即使调用了clk_enable函数AEMIF也不会真正调用__clk_enable函数。也就是说这初始化部分并没有真正使能很多模块的时钟电源只是按初始化的流程走了一个过程而已。在后面要提到的板级设备初始化部分会调用davinci_psc_config函数真正使能一些模块的时钟电源。另外其它模块的时钟电源则分布在各个模块的驱动程序中当驱动加载的时候才会调用clk_enable函数打开这个模块的时钟电源。这部分挺迷惑人的好好理解。davinci_psc_config函数的前一半工作是操作PSC相关的寄存器来使能模块的时钟电源这部分的操作详见数据手册是按手册的步骤来实现的另一半工作是调用davinci_pinmux_setup函数来将此模块相关的复用引脚功能确定它首先调用get_pin_list函数它是个函数指针在先前已经被指向了davinci_get_pins函数它通过ctlr和id两个参数从先前的dm365_pins数组中得到相应的某一维这正是某一模块需要的那些引脚。然后再通过一个循环将这几个引脚调用davinci_cfg_reg函数实现其复用的本模块的功能。davinci_cfg_reg函数很重要也很复杂。它定义一个pin_config类型的指针cfg指向当前引脚在pin_table的位置然后根据其所在的PINMUXx寄存器的位为操作。这里的实现过程操作比较复杂涉及到屏蔽位模式等但总的来说就是模块需要这个引脚做此模块功能而不是其它功能暂不深究。到这里davinci_cfg_reg函数结束了davinci_pinmux_setup函数也就结束了davinci_psc_config函数也就结束了__clk_enableclk_enabledavinci_enable_clks函数也就结束了davinci_clk_init函数也就结束了davinci_init_common_hw函数也就结束了davinci_map_io函数也就结束了。DM365的BSP板定义宏中的map_io也就结束了。下面分析板定义宏中的init_irq它指向davinci_dm365_evm_irq_init函数下面开始分析davinci_dm365_evm_irq_init函数。davinci_dm365_evm_irq_init函数只调用一个davinci_irq_init函数。它首先获得全部64个中断的优先级数组这个前面已经得到并放在全局数组davinci_irq_priorities中。而后操作INTC的寄存器比如清除中断请求禁止中断等而后将设置好的优先级值写入优先级寄存器中。然后就将全部64个中断注册到内核中主要是利用内核中断管理中的set_irq_chip函数set_irq_flags函数set_irq_handler函数特别是set_irq_chip函数它将每一个中断绑定到一个irq_chip结构类型的davinci_irq_chip_0而它包括了三个对中断的处理的函数指针比如使能unmask禁止mask等其实质还是操作了INTC的相关寄存器。这些函数就是在程序中对某一中断进行使能禁止的处理比如调用enable_irq使能某一个中断时其实最终就是调用unmask所指的函数。至此davinci_irq_init函数结束了davinci_dm365_evm_irq_init函数也就结束了。DM365的BSP板定义宏中的init_irq也就结束了。板定义宏中的timer感觉很复杂现在不是很理解以后有机会再看。下面分析板定义宏中的init_machine它指向dm365_evm_init函数下面开始分析dm365_evm_init函数。dm365_evm_init函数是BSP中最重要的了它完成了部分设备的初始化及注册。
http://www.pierceye.com/news/103874/

相关文章:

  • 购物网站中加减数目的怎么做仿站违法吗
  • 代理ip访问网站局门户网站的建设
  • 建网站业务如何开展阳江房产信息网官网
  • 企业网站建设套餐费用网站开发完后期维护重要吗
  • 3营销型网站建设湖北短视频seo推荐
  • 鸿运通网站建设未成年怎么在网上卖东西
  • 郑州网站推广排名公司商会小程序开发一个多少钱啊
  • wordpress单页网站在本页跳转心理网站的建设与维护
  • 哪里可以做网站系统企业管理官网登录入口
  • iis7 网站404错误信息官网下载软件
  • 广州建设网站平台广东seo网站推广代运营
  • 网站 优化 关键字qq官网登录
  • 建设银行园区公积金管理中心网站地方门户网站推广
  • 桂林市网站设计wordpress远程数据库
  • 网站建设多钱怎么做网上卖菜网站
  • 响应式电商网站网站设计常见问题
  • 爱常德网凡科网站可以做seo优化
  • 建设银行手机银行官方网站小程序app公众号的区别
  • 彩票网站维护需要几天企业展示网站建设需要做什么
  • cms网站后台模版惠州网站设计哪家好
  • 海南智能网站建设设计湘潭学校网站建设 x磐石网络
  • 网站建设的入门书籍表格我做视频网站
  • 数据库跟网站内容青岛公司做网站的价格
  • 成都市金牛区建设和交通局网站营销专业网站
  • 免费的视频网站如何赚钱wordpress推广系统
  • 上海酒店团购网站建设网站建设风险分析
  • 做网站的抬头怎么做南昌app定制
  • 深圳市企业网站建设企业品牌设计
  • 做图网站有哪些内容惠州抖音推广
  • 郑州中原区建设局网站公司网站建设素材