2014-06-19 17:59:48 strugglelg 阅读数 6988
  • 深入探究Linux/VxWorks设备树视频教程

    很多人看了很Linux多设备树的资料后,还是不会用设备树。该Linux设备树视频课程假设一个全新的电路板,上面有4个ARM核,一片中断控制器、一个UART、一个GPIO控制器、一个I2C控制器、一个SPI控制器、I2C接一个触摸屏、一个以太网控制器,并依据这个假设的电路板,从头到尾构建一个新的dts文件。并讲解整个板级、设备/驱动匹配的全细节,我们把设备树的使用彻底地变得可实践。

    5210 人正在学习 去看看 宋宝华

dts的概念,在这里就不多说了,

我这里的例子是 openwrt 的dts; cpu是7620的;


这里的power_led的gpio 44


先看右图:

有一个叫gpio2 的结构体,

gpio-base:  gpio个数的头, 基地址

num-gpios: gpio个数的尾

整个意思是 gpio40 ----- gpio72是属于gpio2这个域里面的; <=gpio39,   >=gpio73都不是这里的;



再看左图的power:

gpio = <&gpio2  4   1>;

它指定了power_led的gpio是   用上面的gpio2域,

4是 偏移地址,即40+4=44;   

1是默认高电平(即低电平触发);


2019-05-30 15:23:05 oqqGuMu 阅读数 424
  • 深入探究Linux/VxWorks设备树视频教程

    很多人看了很Linux多设备树的资料后,还是不会用设备树。该Linux设备树视频课程假设一个全新的电路板,上面有4个ARM核,一片中断控制器、一个UART、一个GPIO控制器、一个I2C控制器、一个SPI控制器、I2C接一个触摸屏、一个以太网控制器,并依据这个假设的电路板,从头到尾构建一个新的dts文件。并讲解整个板级、设备/驱动匹配的全细节,我们把设备树的使用彻底地变得可实践。

    5210 人正在学习 去看看 宋宝华

一直想搞明白,自从linux开始使用设备树后,从哪里开始加载和bootloadt kenel之间怎么关联,然后总线驱动如何将这些设备挂上去的。

下周开始总结。

先转载一些基本概念:

 

简介
dts
硬件的相应信息都会写在.dts为后缀的文件中,每一款硬件可以单独写一份xxxx.dts,一般在Linux源码中存在大量的dts文件,对于arm架构可以在arch/arm/boot/dts找到相应的dts,另外mips则在arch/mips/boot/dts,powerpc在arch/powerpc/boot/dts。

dtsi
值得一提的是,对于一些相同的dts配置可以抽象到dtsi文件中,然后类似于C语言的方式可以include到dts文件中,对于同一个节点的设置情况,dts中的配置会覆盖dtsi中的配置

dtc
dtc是编译dts的工具,可以在Ubuntu系统上通过指令apt-get install device-tree-compiler安装dtc工具,不过在内核源码scripts/dtc路径下已经包含了dtc工具;

dtb
dtb(Device Tree Blob),dts经过dtc编译之后会得到dtb文件,dtb通过Bootloader引导程序加载到内核。所以Bootloader需要支持设备树才行;Kernel也需要加入设备树的支持;

 

å¨è¿éæå¥å¾çæè¿°

--------------------- 
作者:UncleMac 
来源:CSDN 
原文:https://blog.csdn.net/u010632165/article/details/89847843 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

 

2017-07-13 14:05:52 zoosenpin 阅读数 283
  • 深入探究Linux/VxWorks设备树视频教程

    很多人看了很Linux多设备树的资料后,还是不会用设备树。该Linux设备树视频课程假设一个全新的电路板,上面有4个ARM核,一片中断控制器、一个UART、一个GPIO控制器、一个I2C控制器、一个SPI控制器、I2C接一个触摸屏、一个以太网控制器,并依据这个假设的电路板,从头到尾构建一个新的dts文件。并讲解整个板级、设备/驱动匹配的全细节,我们把设备树的使用彻底地变得可实践。

    5210 人正在学习 去看看 宋宝华

@ gv.py

out_file = ''
temp_file = ''
dt_dir_path = ''
nr_plats = 1
is_oem = False
is_ext = False
dts_name = ''

arg0_proc_name = ''
arg1_plat_name = ''


@ dts_list.py

################################################
# Show dts tree for msm platform
# Author: George Tso <zoosenpin@163.com>
# 2015-2016, all rights reserved.
################################################

import sys,os
import shutil
import gv

def my_printf(string):
    print string

def print_usage(toast):
    if toast != '':
        print '\n' + toast
    print "\nUsage: python " + gv.arg0_proc_name + " [OPTION...]\n"
    print "    If you want to print all the DT of one platform, you should"
    print "    assign the directory as the first argument, otherwise it "
    print "    will use the current work directory."
    print "    -o    list all the .dtsi files which belong to a .dts to"
    print "        a file"
    print "    -e    list all the .dtsi files which belong to a .dts to"
    print "        a file and copy the assciated .dtsi files to"
    print "        ." + os.path.sep + 'EXT\n'
    print "For example:"
    print "    Linux:"
    print "    python " + gv.arg0_proc_name + " msm8909"
    print "    python " + gv.arg0_proc_name + " ./ msm8909"
    print "    python " + gv.arg0_proc_name + " -o msm8909-1gb-qrd-skuc.dts"
    print "    python " + gv.arg0_proc_name + " -e msm8909-1gb-qrd-skuc.dts\n"
    print "    vi KERNEL-msm8909.list"
    print "    vi OEM-msm8909-1gb-qrd-skuc.dts.list"
    print "    vi ./EXT/OEM-msm8909-1gb-qrd-skuc.dts.list\n"

    print "    <------------------------------------------------>\n"
    print "    Windows:"
    print "    python " + gv.arg0_proc_name + " msm8909"
    print "    python " + gv.arg0_proc_name + " E:\F\case\dts_test msm8909"
    print "    python " + gv.arg0_proc_name + " -o E:\F\case\dts_test\msm8909-1gb-qrd-skuc.dts"
    print "    python " + gv.arg0_proc_name + " -e E:\F\case\dts_test\msm8909-1gb-qrd-skuc.dts\n"
    print "    Open E:\F\case\dts_test\KERNEL-msm8909.list with text editor"
    print "    Open E:\F\case\dts_test\OEM-msm8909-1gb-qrd-skuc.dts.list "
    print "        with text editor"
    print "    Open E:\F\case\dts_test\EXT\OEM-msm8909-1gb-qrd-skuc.dts.list "
    print "        with text editor\n"

def write_file(f_name, line):
    h = open(f_name, 'a+')
    h.writelines(line)
    h.close()

def contains_substring(src, sub):
    if sub in src:
        return True
    elif src.startswith(sub):
        return True
    else:
        return False

def get_dt_list(dir_path, temp_file):
    for dts_file in os.listdir(dir_path):
        if contains_substring(dts_file, gv.arg1_plat_name) > 0:
            write_file(temp_file, dir_path + os.path.sep + dts_file + '\n')

def list_one_tree(dt_file_path, h, out_file):
    fp = open(dt_file_path, 'r')
    for line in fp:
        p = line.lstrip(' ')
        if p.startswith('/*') or p.startswith('//'):
            continue

        if line.find('include') > 0 and line.find(".dtsi") > 0:
            if line.find("/include/") > 0:
                idx = line.find('/include/')
        idx += 9
                p = line[idx:len(line)]
            else:
                idx = line.find('include')
        idx += 7
                p = line[idx:len(line)]
            p = p.lstrip('/').lstrip(' ').lstrip('\"').rstrip('\"')
            p = p.rstrip('\r').rstrip('\n').rstrip('\"')
            write_file(out_file, h + p + '\n')

            # Get the next
        p = p.rstrip('\r').rstrip('\n').lstrip('\"').rstrip('\"')
            p = gv.dt_dir_path + os.path.sep + p
            if os.path.exists(p):
                list_one_tree(p, h + '-', out_file)
    fp.close()

def walk_dt(dt_file_path, out_file, is_oem):
    p = dt_file_path

    idx = dt_file_path.find(os.path.sep)
    if idx > 0:
        idx += 1
        p = dt_file_path[idx:len(dt_file_path)]

    if p != '':
        write_file(out_file,
                "/**************(" + str(gv.nr_plats) +
        ") platform*****************/\n")
        gv.nr_plats += 1

        p = p.rstrip('\r').rstrip('\n')
        idx = p.rfind(os.path.sep)
        if idx > 0:
            idx += 1
            _dts = p[idx:]
        else:
            _dts = p
        write_file(out_file, _dts + '\n')

    dt_file_path = dt_file_path.rstrip('\r').rstrip('\n')
        list_one_tree(dt_file_path, "-", out_file)
        write_file(out_file, "\n")

def _show_dt(dir_path):
    h = open(gv.temp_file, 'r')
    for line in h:
        line = line.rstrip('\r').rstrip('\n')
        if line.endswith('.dts') == True:
            walk_dt(line, gv.out_file, False)
    h.close();

def create_file(file):
    if os.path.exists(file):
        os.remove(file)

    h = open(file, 'w')
    h.write('Author: George Cho <zoosenpin@163.com>\n')
    h.write('If you have any good advice, you can contact me directly\n\n')
    h.close()

def remove_file(file):
    if os.path.exists(file):
        os.remove(file)

def show_dt():
    create_file(gv.temp_file)

    if len(gv.dt_dir_path) > 1:
        get_dt_list(gv.dt_dir_path, gv.temp_file)
        _show_dt(gv.dt_dir_path)

    remove_file(gv.temp_file)

def remove_dir(dir_path):
    if os.path.isdir(dir_path):
        for file in os.listdir(dir_path):
            os.remove(dir_path + os.path.sep + file)
        os.removedirs(dir_path)

def extract_one_DT_to_EXT(file_path):
    if not os.path.exists(file_path):
        return

    is_found = False
    src_dir = gv.dt_dir_path
    dst_dir = gv.dt_dir_path

    h = open(file_path, 'r')
    for line in h:
        if line.find('*') > 0:
            is_found = True
            continue
        if (is_found == False):
            continue
        line = line.lstrip('-').lstrip('/').lstrip('\\')
        line = line.rstrip('\r').rstrip('\n').rstrip('\"')
        src_path = src_dir + os.path.sep + line
        dst_path = dst_dir + os.path.sep + 'EXT' + os.path.sep + line
        if os.path.exists(src_path) and not os.path.isdir(src_path):
            shutil.copy(src_path, dst_path)

def parse_args():
    if len(sys.argv) == 2:
        gv.dt_dir_path = os.getcwd()
        gv.arg1_plat_name = sys.argv[1]
    elif len(sys.argv) == 3:
        if not os.path.isdir(sys.argv[1]) and cmp(sys.argv[1], '-o') and cmp(sys.argv[1], '-e'):
            print_usage()
            sys.exit(0)
        elif not cmp(sys.argv[1], '-o'):
            gv.is_oem = True
            idx = sys.argv[2].rfind(os.path.sep)
            if idx > 0:
                idx += 1
                gv.dt_dir_path = sys.argv[2][0:idx]
                gv.dts_name = sys.argv[2][idx:]
            else:
                gv.dt_dir_path = os.getcwd()
                gv.dts_name = sys.argv[2]
        elif not cmp(sys.argv[1], '-e'):
            gv.is_ext = True
            idx = sys.argv[2].rfind(os.path.sep)
            if idx > 0:
                idx += 1
                gv.dt_dir_path = sys.argv[2][0:idx]
                gv.dts_name = sys.argv[2][idx:]
            else:
                gv.dt_dir_path = os.getcwd()
                gv.dts_name = sys.argv[2]
        else:
            gv.dt_dir_path = sys.argv[1]
            gv.arg1_plat_name = sys.argv[2]

    gv.dt_dir_path = gv.dt_dir_path.rstrip('\r').rstrip('\n')
    gv.temp_file = gv.dt_dir_path + os.path.sep + '.tmp.log'
    if gv.is_oem == True:
        gv.out_file = gv.dt_dir_path + os.path.sep + 'OEM-' + gv.dts_name + '.list'
    elif gv.is_ext == True:
        remove_dir(gv.dt_dir_path + os.path.sep + 'EXT')
        os.makedirs(gv.dt_dir_path + os.path.sep + 'EXT')
        gv.out_file = gv.dt_dir_path + os.path.sep + 'EXT' + os.path.sep + 'OEM-' + gv.dts_name + '.list'
    else:
        gv.out_file = gv.dt_dir_path + os.path.sep + 'KERNEL-' + gv.arg1_plat_name + '.list'

    print '\nDT directory: ' + gv.dt_dir_path
    if gv.is_ext:
        print '\nEXT directory: ' + gv.dt_dir_path + os.path.sep + 'EXT' + os.path.sep
    print '\nout file: ' + gv.out_file + '\n'
    create_file(gv.out_file)

def main():
    gv.arg0_proc_name = sys.argv[0]
    if sys.argv[0].rfind(os.path.sep) > 0 :
        index = sys.argv[0].rfind(os.path.sep)
        gv.arg0_proc_name = sys.argv[0][index+1:]

    if len(sys.argv) < 2:
        print_usage('')
        sys.exit(0)

    parse_args()

    if gv.is_ext == True:
        walk_dt(gv.dt_dir_path + os.path.sep + gv.dts_name,
        gv.out_file, True)
        extract_one_DT_to_EXT(gv.out_file)
    elif gv.is_oem == True:
            walk_dt(gv.dt_dir_path + os.path.sep + gv.dts_name,
        gv.out_file, True)
    else:
        if gv.arg1_plat_name.find('.dts') > 0 or gv.arg1_plat_name.find('dtsi') > 0:
            print_usage('Invalid arguments')
            sys.exit(0)
        show_dt()

if __name__ == '__main__':
    main()


2019-12-07 23:33:30 dc3120 阅读数 15
  • 深入探究Linux/VxWorks设备树视频教程

    很多人看了很Linux多设备树的资料后,还是不会用设备树。该Linux设备树视频课程假设一个全新的电路板,上面有4个ARM核,一片中断控制器、一个UART、一个GPIO控制器、一个I2C控制器、一个SPI控制器、I2C接一个触摸屏、一个以太网控制器,并依据这个假设的电路板,从头到尾构建一个新的dts文件。并讲解整个板级、设备/驱动匹配的全细节,我们把设备树的使用彻底地变得可实践。

    5210 人正在学习 去看看 宋宝华

 

dts --> dtb:
dtc -I dts -O dtb -S -o target.dtb source_name.dts

dtb --> dts:
dtc -I dtb -O dts -o target.dts source_name.dtb

 

参考:

解析DTS

http://blog.chinaunix.net/uid-14704264-id-4279214.html

2016-12-01 00:15:26 gaoguoxin2 阅读数 2412
  • 深入探究Linux/VxWorks设备树视频教程

    很多人看了很Linux多设备树的资料后,还是不会用设备树。该Linux设备树视频课程假设一个全新的电路板,上面有4个ARM核,一片中断控制器、一个UART、一个GPIO控制器、一个I2C控制器、一个SPI控制器、I2C接一个触摸屏、一个以太网控制器,并依据这个假设的电路板,从头到尾构建一个新的dts文件。并讲解整个板级、设备/驱动匹配的全细节,我们把设备树的使用彻底地变得可实践。

    5210 人正在学习 去看看 宋宝华

http://blog.chinaunix.net/uid-12461657-id-3064012.html

https://community.nxp.com/message/597984

https://community.nxp.com/message/934765


1. dts configuration

arch/arm/boot/dts/imx6sl-evk.dts:

MX6SL_PAD_EPDC_D9__GPIO1_IO16       0x1b0b0

          interrupt-parent = <&gpio1>;
          interrupts = <16 2>;

2.  c source 

#include<linux/kernel.h>
#include<linux/types.h>
#include<linux/kthread.h>
#include<linux/wait.h>
#include<linux/string.h>
#include<linux/sysctl.h>
#include<linux/workqueue.h>
#include<linux/interrupt.h>
#include<linux/irq.h>
#include<linux/device.h>
#include<linux/gpio.h>

int irq = 176;

static int irq_handler(int irq_num, void *dev_id)
{
        printk("interrupt handler function:%d...\n", irq_num);
        return IRQ_WAKE_THREAD;
}

static int irq_thread_fn(int irq_num, void *dev_id)
{
        printk("interrupt thread function:%d...\n", irq_num);
        return IRQ_HANDLED;
}

static int __init request_threaded_irq_init(void)
{
        int result = 0;

        printk("gpio_to_irq()=%d\n", gpio_to_irq(16));
        result = request_threaded_irq(irq, irq_handler, irq_thread_fn, IRQF_DISABLED,
                                                         "irq_test", NULL);
        disable_irq(irq);
        enable_irq(irq);
        return 0;
}

static void __exit request_threaded_irq_exit(void)
{
        free_irq(irq, NULL);
        printk("Goodbye request_threaded_irq\n");
        return;
}

module_init(request_threaded_irq_init);
module_exit(request_threaded_irq_exit);
MODULE_LICENSE("GPL");
                   

3. result



linux clock dts

阅读数 43

linux msm dts加载分析

阅读数 2932

Linux DTS配置总结

阅读数 6144

没有更多推荐了,返回首页