本帖最后由 嵌嵌前行 于 2018-3-15 10:11 编辑
思路整理:
①硬件所使用的接口引脚以及芯片相对于imx6官方来说,没有任何变化,按道理不需要做任何移植,只要是按照官方的配置编译出来的内核都应该能使用can总线。
②但是按照老大的意思是好像并不是按照官方的配置就能使用,最后查找原因是因为在设备树中flexcan设备是disable的。(备注:自己采用的设备树是imx6q-sabresd.dts,之所以采用这个设备树是一个已经烧写好系统的imx6q板子上内核dmesg信息猜测的。)设备上电启动不能识别CAN。
Dmesg信息:
然后打开该设备树大致看了下,发现压根就没有flexcan的相关信息:
然后再到其头文件imx6qdl-sabresd.dtsi文件中看了下,发现也没有flexcan的相关描述,最后根据各个文件所包含的头文件,在imx6qdl.dtsi文件中找到了:
其内存地址也非常符合本芯片在数据手册中的描述,所以确定这个设备树应该是适合本芯片的。但是其状态是disabled的,而且也没有对硬件原理图中复用引脚GPIO_7(CAN_TX)和GPIO_8(CAN_RX)进行任何配置。最后参照网上别人移植的教程:
在imx6qdl-sabresd.dtsi中添加了相关的复用引脚定义并okay flexcan1
然后在内核源码中对设备树进行了编译生成了imx6q-sabresd.dtb文件,期待把板子里的设备树用自己修改过的设备树替换一下来检测自己的想法。但是发现两个困境:
一、 开发板上电进不去UBOOT环境,无法通过UBOOT环境把设备树拷到emmc中去
二、 Cat /proc/mtd看不到分区信息,找不到设备树的地址,无法在通过cat或dd命令把设备树写进去
三、 老大不让通过刷机的形式去把新的设备树烧进板子,而自己也没有板子现有系统文件,容易造成板子现有文件丢失,不能还原。
老大提示:
老版本内核没有设备树
①(设备的加载是通过insmod的形式来弄的,但是内核中的flexcan驱动程序是平台设备,也就是通过设备树去匹配的,那么自己就需要更改设备的驱动模型,还需要添加端口定义,这………就非常的麻烦了,而且自己还不能保证其正确性……………………………………)
②在内核里面创造硬件设备?
③使用平台文件提供设备信息给内核。
Linux4.1.15操作规范(自己网上搜了下好像没有这方面的资料)
开发上得到的其它信息:
① /proc/net下面有can设备描述
说明内核中是有相关设备的信息描述的。
② 在/sys/firmware/devicetree/base目录中(设备树节点目录)中没有flexcan的相关描述
③ 但是在/sys/module下却有can的相关描述(模块描述)
④ 在/sys/class/net目录下没有flexcan设备的相关描述
⑤ 用模块的方式将flexcan驱动直接给insmod进去(备注:直接将内核中的flexcan驱动源码抽离出来编译成模块)
最后自己的理解:
板子所搭载的内核中应该是有flexcan驱动的,而且是直接编译到内核里面的,不然以模块的方式加载的时候不会出现已经注册的情况,所以估计多半是设备树的缘故导致内核不能检测到CAN设备,不能在/sys/class/net中创建相关设备文件,导致CAN总线不能使用。
自己的困境:
不知道怎么把一个新编译好的设备树放到板子里面去(不通过刷机,不通过UBOOT环境),而且即使烧进去了也很可能因为自己和别人设备树配置的不一样导致板子上某些硬件不能使用(因为自己只是参照官方设备树配置进行了修改flexcan模块,没有针对整个板子进行修改)
或者说:
不知道怎么在一个已经启动的内核里面去直接创建设备文件。
作为一个新人..........哎..........求大神们支支招啊
|